这个问题已经有了答案:
为什么浮点数是精确的而算术运算不是?我的意思是编译器不是舍入到最接近的数字来表示两个数字,而不仅仅是算术运算的结果?
double a = 0.1; double b = 0.2; System.out.println(a); System.out.println(b); System.out.println(a + b);
输出;
0.1 0.2 0.30000000000000004
我所期望的;
0.10000000000000001 0.20000000000000003 0.30000000000000004
编辑: 这些操作之间有什么区别?
double a = 0.3; double b = 0.1 + 0.2; System.out.println(a); //0.3 System.out.println(b); //0.300000000000004
转换文本时(例如 this converter)您将看到位表示是 最精确的 一个。然而 实际的 存储值略有不同,这导致:
0.1 = 1.00000000000000005551115123126E-1 0.2 = 2.00000000000000011102230246252E-1 和 0.3 = 2.99999999999999988897769753748E-1
0.1
1.00000000000000005551115123126E-1
0.2
2.00000000000000011102230246252E-1
0.3
2.99999999999999988897769753748E-1
正如你所看到的,文字表示的总和 0.30000000000000004 但不会产生与 零点三 因此,输出值的处理方式与 零点三 是的。
0.30000000000000004
零点三