java中使用浮点作为保护的奇怪输出

java中使用浮点作为保护的奇怪输出,java,for-loop,floating-point,Java,For Loop,Floating Point,可能重复: 为什么会输出以下代码: for (float j2 = 0.0f; j2 < 10.0f; j2+=0.1f) { System.out.println(j2); } 还有一个问题:即使我像其他人提到的那样将for循环的条件更改为j2,这也是关于浮点数的精度以及操作的每一步都可能增加错误的事实 这就是为什么你从不使用浮动来代表金钱。查看BigDecimal以了解精确的十进制处理 10.0未包括在内的原因是该金额已浮动,不再是10.0 浮点数不表示为精确的数字,而是表

可能重复:

为什么会输出以下代码:

for (float j2 = 0.0f; j2 < 10.0f; j2+=0.1f) {
    System.out.println(j2);
}

还有一个问题:即使我像其他人提到的那样将for循环的条件更改为
j2,这也是关于浮点数的精度以及操作的每一步都可能增加错误的事实

这就是为什么你从不使用浮动来代表金钱。查看BigDecimal以了解精确的十进制处理

10.0
未包括在内的原因是该金额已浮动,不再是10.0

浮点数不表示为精确的数字,而是表示为系数和指数,如
(−1) ^s×c×b^q
并添加到浮点数将结合两个数字的不确定性。由于精度损失,这可能转化为0.7000005,而不是0.7


正如其他人所提到的,这是关于浮点数的精度以及操作的每一步都可能增加错误的事实

这就是为什么你从不使用浮动来代表金钱。查看BigDecimal以了解精确的十进制处理

10.0
未包括在内的原因是该金额已浮动,不再是10.0

浮点数不表示为精确的数字,而是表示为系数和指数,如
(−1) ^s×c×b^q
并添加到浮点数将结合两个数字的不确定性。由于精度损失,这可能转化为0.7000005,而不是0.7

请从以下位置查看

为什么我的数字,比如0.1+0.2加起来不等于0.3,然后 相反,我得到了一个奇怪的结果,比如0.300000000004?

因为在内部,计算机使用一种格式(二进制浮点) 这根本不能准确地表示0.1、0.2或0.3这样的数字

当编译或解释代码时,您的“0.1”已被删除 按该格式四舍五入到最接近的数字,这将导致较小的 甚至在计算之前就存在舍入误差

从:

为什么我的数字,比如0.1+0.2加起来不等于0.3,然后 相反,我得到了一个奇怪的结果,比如0.300000000004?

因为在内部,计算机使用一种格式(二进制浮点) 这根本不能准确地表示0.1、0.2或0.3这样的数字

当编译或解释代码时,您的“0.1”已被删除 按该格式四舍五入到最接近的数字,这将导致较小的 甚至在计算之前就存在舍入误差


double
float
在计算中都有舍入误差,使用
float
的表示误差(其值不能精确表示)比使用
double
的误差大得多,这是避免使用它的一个很好的理由。错误可能会大10^8倍

当您打印浮点数时,它将执行少量舍入操作以向您隐藏此错误。误差很容易大到可以看到的程度

因此,通过定义所需的准确度,自己对结果进行四舍五入通常是一个好主意

for (float j2 = 0.0f; j2 < 10.05f; j2+=0.1f)
    System.out.printf("%.1f ", j2);
印刷品

0.1f = 0.100000001490116119384765625
0.1 = 0.1000000000000000055511151231257827021181583404541015625
0.1f - 0.1 = 1.4901161138336505E-9 or 1.4901161138336505018742172978818416595458984375E-9

如前所述,如果没有合理的舍入,就不能将浮点单独用于货币(或许多其他用途)。如果代码的性能和可读性不成问题,请改用BigDecimal。

双精度
浮点
都有计算舍入误差和表示误差(因为其值不能准确表示)使用
float
比使用
double
有更多的错误,这是避免它的一个很好的理由。错误可能会大10^8倍

当您打印浮点数时,它将执行少量舍入操作以向您隐藏此错误。误差很容易大到可以看到的程度

因此,通过定义所需的准确度,自己对结果进行四舍五入通常是一个好主意

for (float j2 = 0.0f; j2 < 10.05f; j2+=0.1f)
    System.out.printf("%.1f ", j2);
印刷品

0.1f = 0.100000001490116119384765625
0.1 = 0.1000000000000000055511151231257827021181583404541015625
0.1f - 0.1 = 1.4901161138336505E-9 or 1.4901161138336505018742172978818416595458984375E-9

如前所述,如果没有合理的舍入,就不能将浮点单独用于货币(或许多其他用途)。如果代码的性能和可读性不是问题,请改用BigDecimal。

o/p是什么意思?如果你的意思是“输出”,请输入Yes o/p=output。为你更新;p浮点数不是精确的
3.0
4.2
。将它们相加会增加不准确度。请查看有关浮点运算的信息:@markyes。j2变量永远不等于10.0。它略大于10。你说的o/p是什么意思?如果你的意思是“输出”,请输入Yes o/p=output。为你更新;p浮点数不是精确的
3.0
4.2
。将它们相加会增加不准确度。请查看有关浮点运算的信息:@markyes。j2变量永远不等于10.0。它略大于10。