十进制格式舍入模式产生不一致的值
Decimal Format Rounding Mode produces inconsistent values
我发现使用所示的小数格式和舍入模式对某些值的表现出乎意料
double b = 123.135;
//double b = 1896.675;
//double b = 523.135;
DecimalFormat df = new DecimalFormat(".##");
df.setRoundingMode(RoundingMode.HALF_UP);
System.out.println(b);
String a = df.format(b);
System.out.println(a);
double roundOff = Math.round(b * 100.0) / 100.0;
System.out.println(roundOff);
生产:
123.135
123.14
123.14
我认为这是正确的。
使用此值时:1896.675 生成以下内容:
1896.675
1896.67
1896.68
我认为这是出乎意料的 - 我在这里做错了什么?
这里的问题是,由于二进制格式的限制,不可能将所有可能的分数存储在一个变量中。所以基本上 double 只是近似于您输入的值,这就是发生舍入错误的原因。
您可以阅读更多关于此主题的信息,例如此主题:how does java.math.RoundingMode work?
长话短说,如果您想要精确舍入,请使用 BigDecimal(以及 BigDecimal 的 valueOf 函数 class)
我发现使用所示的小数格式和舍入模式对某些值的表现出乎意料
double b = 123.135;
//double b = 1896.675;
//double b = 523.135;
DecimalFormat df = new DecimalFormat(".##");
df.setRoundingMode(RoundingMode.HALF_UP);
System.out.println(b);
String a = df.format(b);
System.out.println(a);
double roundOff = Math.round(b * 100.0) / 100.0;
System.out.println(roundOff);
生产:
123.135
123.14
123.14
我认为这是正确的。
使用此值时:1896.675 生成以下内容:
1896.675
1896.67
1896.68
我认为这是出乎意料的 - 我在这里做错了什么?
这里的问题是,由于二进制格式的限制,不可能将所有可能的分数存储在一个变量中。所以基本上 double 只是近似于您输入的值,这就是发生舍入错误的原因。 您可以阅读更多关于此主题的信息,例如此主题:how does java.math.RoundingMode work?
长话短说,如果您想要精确舍入,请使用 BigDecimal(以及 BigDecimal 的 valueOf 函数 class)