java - 双重比较问题

标签 java comparison double

我正在用 Java 编写一个音高检测程序,并在 for 循环的每次迭代中比较两个 double 值,以确定样本数组中的最高幅度点。

其代码是:

double magnitude = 0.0;
double maxMag = 0.0;

int j = 0;
    for (int i = 0; i < 2640; i += 2) {
        magnitude = calcMag(sample[i], sample[i + 1])
                * (i < outputLength / 2 ? calcMag(sample[i * 2],
                        sample[i * 2 + 1]) : 1.0)
                * (i < outputLength / 3 ? calcMag(sample[i * 3],
                        sample[i * 3 + 1]) : 1.0)
                * (i < outputLength / 4 ? calcMag(sample[i * 4],
                        sample[i * 4 + 1]) : 1.0)
                * (i < outputLength / 5 ? calcMag(sample[i * 5],
                        sample[i * 5 + 1]) : 1.0);

        if (magnitude > maxMag) {
            maxMag = magnitude;
            peakIndex = j;
        }

        j++;
    }

使用调试器并查看变量,“magnitude”和“maxMag”的比较第一次可以正确工作(当 maxMag 为零时),但从那时起,即使当magnitude 为事实上大于 maxMag。

(magnitude > maxMag)为 false 时的比较值示例:

震级 = 2.828262485980501E20

最大磁力=1.3167436120685821E28

我多年来一直在研究这个问题,并四处寻找比较 double 的潜在问题(我已经尝试过 Double 的比较方法但无济于事)。所以现在我想知道这里是否有人可以阐明我可能做错了什么?

谢谢

最佳答案

这里的数字是用科学记数法写的,有小数表示法吗

2.828262485980501E20 = 2.828262485980501 * 10^20 = 282826248598050100000

1.3167436120685821E28 = 1.3167436120685821 * 10^28 = 13167436120685821000000000000

所以

2.828262485980501E20 < 1.3167436120685821E28

程序输出正确。

关于java - 双重比较问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9220100/

相关文章:

java - 运算符/赋值/关于类的事情 (Java)

java - JAVA 中的对象比较...第 2 部分

perl - 包含字母字符的字符串如何在数值上等同于 Perl 中的数字?

java - 如何很好地将 float 格式化为没有不必要的十进制 0 的字符串

java - 更改机器数学和逻辑错误

java - 无法将 double 组转换为数组

java - JFrame 使用 GridBagLayout 定位组件

java - 如何使用 Selenium WebDriver 选择新的 IFrame?

c++ - C++ 标准中 pair<> 的全局不等式比较

java.lang.NumberFormatException : Invalid double: ""