java逗号双数乘法 1 周,5 日 Questions & Answers 201 为什么这个java代码返回61.004999999999995而不是61,005??我不明白 System.out.println(105*0.581);
# 1 楼答案 它的出现是由于浮点数的性质。计算机处理浮点数的智能不是很强,所以我们必须基于近似值来工作。 而不是6.005==6.004999,你应该这样做:6.005-6.004999<;=0.001
# 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
# 1 楼答案
它的出现是由于浮点数的性质。计算机处理浮点数的智能不是很强,所以我们必须基于近似值来工作。 而不是6.005==6.004999,你应该这样做:6.005-6.004999<;=0.001
# 2 楼答案
你陷入了浮点精度问题。在计算机科学中有一个简单的事实:你不能代表所有的实数。Java也是如此
如果你想深入研究,你可以研究浮点数是如何存储在内存中的。关键词是:符号位;尾数和指数。请注意,精度还取决于系统内存(32或64) http://en.wikipedia.org/wiki/Single-precision_floating-point_format
对于Java,为了获得更高的精度,可以使用BigDecimal:
您还可以使用round(MathContext mc)对其进行取整,如果将精度设置为5,则该值将为61.005
https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html
如果只是关于如何显示的问题,而精度无关紧要,那么可以使用DecimalFormat
https://docs.oracle.com/javase/8/docs/api/java/text/DecimalFormat.html