10个问题的力量

may*_*ʎɐɯ 0 java

我在愚蠢的问题上运行,从未见过它.

我正在尝试做一个非常简单的任务,进行一些需要增加10的幂的数学计算.

首先,我写了一个非常简单的增长循环,它工作得很好,但是我不理解,获得的值越高,得到的结果就越精确.

我想知道为什么会这样?以及如何解决它?

我的测试代码:

public class PowerOfTen {

    private int lineCounter = 1;

    public static void main(String[] args) {
        PowerOfTen powerOfTen = new PowerOfTen();

        powerOfTen.growingOfTenMethodOne();
        powerOfTen.growingOfTenMethodTwo();
    }

    public void growingOfTenMethodOne() {

        double MAX_VALUE = 1e50;
        lineCounter = 1;

        for (double i = 1; i < MAX_VALUE; i = i * 10) {
            System.out.printf("%03d%1s%f\n", lineCounter, " | ", i);
            lineCounter++;
        }
    }

    public void growingOfTenMethodTwo() {

        double MAX_VALUE = 50;
        lineCounter = 1;

        for (double i = 0; i < MAX_VALUE; i++) {
            System.out.printf("%03d%1s%f\n", lineCounter, " | ", Math.pow(10, i));
            lineCounter++;
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

两种方法都有效,并且假设返回正确的结果,但是在这两种方法中都会给出一些不准确的结果,如下面的示例所示.

方法1: 第24,26,27,28,31,32,33行未返回正确的结果

022 | 1000000000000000000000.000000
023 | 10000000000000000000000.000000
024 | 99999999999999990000000.000000
025 | 1000000000000000000000000.000000
026 | 9999999999999999000000000.000000
027 | 99999999999999990000000000.000000
028 | 999999999999999900000000000.000000
029 | 10000000000000000000000000000.000000
030 | 100000000000000000000000000000.000000
031 | 999999999999999900000000000000.000000
032 | 9999999999999999000000000000000.000000
033 | 99999999999999990000000000000000.000000
Run Code Online (Sandbox Code Playgroud)

方法2: 第24,30行未返回正确的结果

022 | 1000000000000000000000.000000
023 | 10000000000000000000000.000000
024 | 99999999999999990000000.000000
025 | 1000000000000000000000000.000000
026 | 10000000000000000000000000.000000
027 | 100000000000000000000000000.000000
028 | 1000000000000000000000000000.000000
029 | 10000000000000000000000000000.000000
030 | 100000000000000010000000000000.000000
031 | 1000000000000000000000000000000.000000
032 | 10000000000000000000000000000000.000000
033 | 100000000000000000000000000000000.000000
Run Code Online (Sandbox Code Playgroud)

Gho*_*ica 6

这不是一个"愚蠢的问题"; 它是计算机科学的核心问题之一......处理数字的正确表示是一项非平凡的任务.

例如,你可能想在这里开始阅读.

任何"编程"的人都应该明白这实际意味着什么; 以及它如何影响您的应用/解决方案.