我有以下简单的代码:
for (float i=0; i<1f; i+=0.1) {
System.out.println(i);
}
我刚收到以下结果:
0.0
0.1
0.2
0.3
0.4
0.5
0.6
0.70000005
0.8000001
0.9000001
但我无法理解为什么会这样。拜托,我希望你能告诉我。谢谢。
答案 0 :(得分:8)
为什么我的数字,如0.1 + 0.2加起来不是很好的一轮0.3,而且 相反,我得到一个奇怪的结果,如0.30000000000000004?
因为在内部,计算机使用格式(二进制浮点) 它不能准确地表示0.1,0.2或0.3之类的数字。
编译或解释代码时,您的“0.1”已经存在 四舍五入到该格式的最接近的数字,这导致一个小的 甚至在计算发生之前就会出现舍入错误。
答案 1 :(得分:1)
好吧因为浮法的实现方式通常与你递增的数学0.1f有很小的偏差,所以实际上你只是增加了一小部分。
解决方案是使用:
BigDecimal
编辑:
迈克尔发布了一个更好的问题描述,但你仍然应该看看BigDecimal。
答案 2 :(得分:0)
这是因为计算机存储浮点数的方式。 有关详细信息,您可以查看IEEE 754。
这与数字问题有关。
答案 3 :(得分:0)
在打印浮点数或双打时,您几乎总是需要约束小数位数。
Java从C
采取printffor (float i = 0; i < 1f; i += 0.1) {
System.out.printf("%.1f\n", i);
}
DecimalFormat,如有必要,最多可打印1位小数
DecimalFormat format1 = new DecimalFormat("#.#");
for (float i = 0; i < 1f; i += 0.1) {
System.out.println(format1.format(i));
}
DecimalFormat始终打印1个小数位
DecimalFormat format2 = new DecimalFormat("0.0");
for (float i = 0; i < 1f; i += 0.1) {
System.out.println(format2.format(i));
}