很难解释,但就是这样。在java代码中,我使用了一个双数,但这个数字最后得到的数字非常小,我不想要。也许我需要用更好的方法来得到剩余的。这是代码:public class MyClass { public static void main(String args[]) { String vRetour = ""; Boolean valeurTrouve = false; double chiffre = .08 ; double valeurTravailDouble = 0; long vIntegerPart = 0; while (! valeurTrouve) { for (int i = 0; i<101;i++) { valeurTravailDouble = chiffre * 8; vIntegerPart = (long) valeurTravailDouble; vRetour = vRetour + vIntegerPart; if ((valeurTravailDouble - vIntegerPart) == 0) { valeurTrouve = true; break; } chiffre = (valeurTravailDouble - vIntegerPart); System.out.println(i + " = " + chiffre); } }}}问题是在最后,我有像第 1 行那样不需要的数字,最后我有一个 1。在第 2 行之后,我有一个 9。但是这个数字的增加和增加在第 17 行给我带来了坏处,因为他增加了成为我号码的一部分。0 = 0.641 = 0.12000000000000012 = 0.96000000000000093 = 0.68000000000000684 = 0.440000000000054575 = 0.52000000000043666 = 0.160000000003492467 = 0.28000000002793978 = 0.240000000223517429 = 0.920000001788139310 = 0.3600000143051147511 = 0.88000011444091812 = 0.0400009155273437513 = 0.3200073242187514 = 0.5600585937515 = 0.4804687516 = 0.8437517 = 0.75怎么了,如何在不保留数字末尾的情况下处理 double ?
3 回答
holdtom
TA贡献1805条经验 获得超10个赞
众所周知,Java 无法正确“添加”。您应该尝试在代码中较早地舍入数字并限制小数位以防止出现错误。用于import java.math.BigDecimal
在完成计算之前进行四舍五入。
慕妹3242003
TA贡献1824条经验 获得超6个赞
这不是Java的问题。一般来说,这是计算机中浮点数的硬件表示问题。Java 并没有向您“隐藏”这个事实。
该表示有两个部分。尾数和指数。
FP 数然后表示为M * 2 ^ E
。
现在想象一下这个表示中的数字 0.1,限制为 3 位(2 + 符号)。要表示的最小片段是 2^-3,即 0.128。因此,尝试表示 0.1 最终会得到 0.128。使用计算机,精度要大得多,但仍然有限。所以你可以得到更小的差异。
为了证明更大的差异,现在想象 0.1*10 转换为“我们用 4 位指数表示,我们得到 0.128*10 = 1.28 !
这是计算机中 FP 数字的普遍问题。这就是为什么不推荐使用例如比较 FP 数字的原因a == b
添加回答
举报
0/150
提交
取消