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

很难解释,但就是这样。在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.64

  • 1 = 0.1200000000000001

  • 2 = 0.9600000000000009

  • 3 = 0.6800000000000068

  • 4 = 0.44000000000005457

  • 5 = 0.5200000000004366

  • 6 = 0.16000000000349246

  • 7 = 0.2800000000279397

  • 8 = 0.24000000022351742

  • 9 = 0.9200000017881393

  • 10 = 0.36000001430511475

  • 11 = 0.880000114440918

  • 12 = 0.04000091552734375

  • 13 = 0.32000732421875

  • 14 = 0.56005859375

  • 15 = 0.48046875

  • 16 = 0.84375

  • 17 = 0.75

怎么了,如何在不保留数字末尾的情况下处理 double ?


湖上湖
浏览 168回答 3
3回答

holdtom

众所周知,Java 无法正确“添加”。您应该尝试在代码中较早地舍入数字并限制小数位以防止出现错误。用于import java.math.BigDecimal在完成计算之前进行四舍五入。

慕妹3242003

这不是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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java