为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

米脂 2019-03-29 23:19:51
我需要将一个数字格式化为###.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 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

 double d = 3.1465926;  
 String result = String.format("%.4f", d);
 System.out.println(result);

可以使用这个试试!


查看完整回答
反对 回复 2019-04-30
?
aluckdog

TA贡献1847条经验 获得超7个赞

楼主代码没错,而运行结果不是楼主所想的原因:是因为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文档学习。希望对楼主有帮助


查看完整回答
反对 回复 2019-04-30
  • qq_慕侠9258777
    qq_慕侠9258777
    1.99985 你可以试试这个保留四位四舍五入的结果. 他这个应该是用的银行家舍入法.
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

df.setRoundingMode(RoundingMode.HALF_UP);

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


查看完整回答
反对 回复 2019-04-30
  • 3 回答
  • 0 关注
  • 1544 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号