2 asiaasia666 asiaasia666 于 2013.09.17 17:44 提问

求高手解答:DecimalFormat四舍五入问题。

我需要将一个数字格式化为###.0000格式,比如1.2,格式化为1.2000
12.00005,我希望得到12.0001
很遗憾我现在没有找到好的办法可以达到我的目的。
下面为我的测试代码。
求大神给个方法,最好也能解释下java.text.DecimalFormat的机制。

public class FormatTest {

    public static void main(String[] args) {
        java.text.DecimalFormat df = new java.text.DecimalFormat("###.0000");
        java.lang.Double db1 = new java.lang.Double("12.00005");
        java.lang.Double db2 = new java.lang.Double("12.00006");
        java.lang.Double db3 = new java.lang.Double("12.000055");
        java.lang.Double db4 = new java.lang.Double("12.000056");

        System.out.println(df.format(db1)); // 输出结果是12.0000
        System.out.println(df.format(db2)); // 输出结果是12.0001
        System.out.println(df.format(db3)); // 输出结果是12.0001
        System.out.println(df.format(db4)); // 输出结果是12.0001

    }
}

3个回答

shendixiong
shendixiong   2013.09.18 18:19
已采纳
 double d = 3.1465926;  
 String result = String.format("%.4f", d);
 System.out.println(result);

可以使用这个试试!

asiaasia666
asiaasia666 还是采纳你的答案吧!
大约 4 年之前 回复
asiaasia666
asiaasia666 String.format处我这里编译无法通过。
大约 4 年之前 回复
u010043538
u010043538   2013.09.19 21:06

楼主代码没错,而运行结果不是楼主所想的原因:是因为java标准是美国人制定的,而美国人常用运算思维是上述结果,不同于我们中国人的思维是四舍五入,所以java默认的格式是HALF_EVEN,这是美国人的思维。想要得到楼主想要的结果,只要加一行代码就行了。具体代码如下:


import java.text.DecimalFormat;
import java.math.RoundingMode;

public class Test1{
public static void main(String args[]){

    DecimalFormat df = new DecimalFormat("###.0000");
    df.setRoundingMode(RoundingMode.HALF_UP);

    double db1 = 12.00005;
    double db2 = 12.00006;
    double db3 = 12.000055;
    double db4 = 12.000056;

    System.out.println(df.format(db1)); // 输出结果是12.0001
    System.out.println(df.format(db2)); // 输出结果是12.0001
    System.out.println(df.format(db3)); // 输出结果是12.0001
    System.out.println(df.format(db4)); // 输出结果是12.0001
}

}


这样就正确了
java.math
枚举 RoundingMode
java.lang.Object
继承者 java.lang.Enum
继承者 java.math.RoundingMode


java.text
类 DecimalFormat
java.lang.Object
继承者 java.text.Format
继承者 java.text.NumberFormat
继承者 java.text.DecimalFormat


不同舍入模式下的舍入操作汇总 根据给定的舍入模式将输入数字舍入为一位数的结果
输入数字 UP DOWN CEILING FLOOR HALF_UP HALF_DOWN HALF_EVEN UNNECESSARY
5.5 6 5 6 5 6 5 6 抛出 ArithmeticException
2.5 3 2 3 2 3 2 2 抛出 ArithmeticException
1.6 2 1 2 1 2 2 2 抛出 ArithmeticException
1.1 2 1 2 1 1 1 1 抛出 ArithmeticException
1.0 1 1 1 1 1 1 1 1
-1.0 -1 -1 -1 -1 -1 -1 -1 -1
-1.1 -2 -1 -1 -2 -1 -1 -1 抛出 ArithmeticException
-1.6 -2 -1 -1 -2 -2 -2 -2 抛出 ArithmeticException
-2.5 -3 -2 -2 -3 -3 -2 -2 抛出 ArithmeticException
-5.5 -6 -5 -5 -6 -6 -5 -6 抛出 ArithmeticException


至于详细的帮助,建议楼主下载一份java API文档学习。希望对楼主有帮助

asiaasia666
asiaasia666 很可惜,我用的jdk是1.4和1.5。 目前不可能升级到JDK1.6的。
大约 4 年之前 回复
sasuke38
sasuke38   2013.09.18 11:45
df.setRoundingMode(RoundingMode.HALF_UP); 

加上这句代码试试看试试看

asiaasia666
asiaasia666 一般企业不会追求高端。安全最好。公司太多东西都是旧版本,奈若何?!
大约 4 年之前 回复
sasuke38
sasuke38 为啥升级不了 直接安装jdk1.6即可 ide那里选择jdk1.6即可
大约 4 年之前 回复
asiaasia666
asiaasia666 很可惜,我用的jdk是1.4和1.5。 目前不可能升级到JDK1.6的。
大约 4 年之前 回复
asiaasia666
asiaasia666 试过了,编译通不过。 The method setRoundingMode(RoundingMode) is undefined for the type DecimalFormat
大约 4 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片