逗号双数乘法

时间:2015-03-26 16:14:10

标签: java

为什么这个java代码返回61.004999999999995而不是61,005?我不明白。

System.out.println(105*0.581); 

2 个答案:

答案 0 :(得分:2)

由于浮点数的性质而发生。计算机使用浮点数不是很聪明,所以我们必须根据近似值进行工作。 而不是6.005 == 6.004999,你应该这样做:6.005 - 6.004999< = 0.001

答案 1 :(得分:2)

你陷入浮点精度问题。在计算机科学中,有一个简单(但是有趣)的事实:你不能代表所有实数。 Java也是如此。

如果您想深入了解,可以研究浮点数如何存储在内存中。关键词是:符号位;尾数和指数。请注意,精度还取决于系统内存(32或64) http://en.wikipedia.org/wiki/Single-precision_floating-point_format

Java说,为了更精确,你可以使用BigDecimal:

System.out.println(new BigDecimal(105).multiply(new BigDecimal(0.581));

您还可以使用round(MathContext mc)对其进行舍入,如果将精度设置为5,则在这种情况下将为您提供61.005。

System.out.println(new BigDecimal(105).multiply(new BigDecimal(0.581)).round(new MathContext(5)));

https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html

如果只是关于如何显示它和精确度的问题,你可以使用DecimalFormat。

System.out.println(new DecimalFormat("###.###").format(105*0.581));

https://docs.oracle.com/javase/8/docs/api/java/text/DecimalFormat.html