您遇到的问题是 0.1 用稍高的数字表示,例如
System.out.println(new BigDecimal(0.1));
印刷
0.1000000000000000055511151231257827021181583404541015625
Double.toString() 考虑了这种表示错误,因此您看不到它。
类似地,0.3 由一个比实际值略低的值表示。
0.299999999999999988897769753748434595763683319091796875
如果将 0.1 的表示值乘以 3,则不会得到 0.3 的表示值,而是会得到更高的值
0.3000000000000000166533453693773481063544750213623046875
这不仅是表示错误,而且是操作引起的舍入错误。这比 Double.toString() 更正,因此您会看到舍入错误。
故事的寓意,如果您使用float
或double
也适当地使用解决方案。
double d = 0.1 + 0.1 + 0.1;
System.out.println(d);
double d2 = (long)(d * 1e6 + 0.5) / 1e6; // round to 6 decimal places.
System.out.println(d2);
印刷
0.30000000000000004
0.3