请教一个关于Java浮点数精度的基础问题

执行这两行:

System.out.println(0.3-0.1);
System.out.println(0.4-0.2);

打印出来的分别是:

0.19999999999999998
0.2

问题1:为什么第一个现实出来的,小数点后面有17位,double的长度不是64么,不应该只能显示16位么?

问题2:浮点数的精度问题原因我懂,但是为什么同样结果是0.2,上面的存在精度问题,下面的却不存在?

谢谢回答?

阅读 3.4k
6 个回答

建议你看看浮点数使用二进制是如何表示的。 这里的问题就是0.30.1不能使用二进制完全表示,所以会丢失精度,而0.40.2 是可以完全表示的

有一个很经典的问题:为什么java 中 0.1 + 0.2 = 0.30000000000000004

想避免精度问题,可以用java.math.BigDecimal解决。关于浮点数具体怎么用二进制表示的,自己查查吧

看了一下回答
也许可以这么解释:

浮点型数据的精度问题=>比作一个有空的桶,把水倒进去之后,倒进去去水会与桶中的水有几率存在不相同的体积(原来的水未必是原来的水)


public class Test {
    public static void main(String args[]) {
        System.out.println(0.3f-0.1f);
        System.out.println(0.3-0.1);
    }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题