为了账号安全,请及时绑定邮箱和手机立即绑定

Java 为什么我的双数在最后得到数字

Java 为什么我的双数在最后得到数字

湖上湖 2021-07-08 17:08:28
很难解释,但就是这样。在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在完成计算之前进行四舍五入。

查看完整回答
反对 回复 2021-07-29
?
慕妹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


查看完整回答
反对 回复 2021-07-29
  • 3 回答
  • 0 关注
  • 164 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信