理解浮点计数器

时间:2012-03-13 15:03:28

标签: java

我有以下简单的代码:

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

但我无法理解为什么会这样。拜托,我希望你能告诉我。谢谢。

4 个答案:

答案 0 :(得分:8)

来自The Floating-Point Guide

  

为什么我的数字,如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

采取printf
for (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));
}