【问题标题】:Javascript float comparisonJavascript浮动比较
【发布时间】:2014-02-10 23:28:37
【问题描述】:

我在 javascript 中进行数字比较时遇到了一个大问题。

脚本指责比较“7

console.clear();

var min = parseFloat("5").toFixed(2);
var max = parseFloat("10").toFixed(2);
var value = parseFloat("7").toFixed(2);

console.log(min, max, value);

console.log(value > min); // OK.
console.log(value < max); // ---- false ??????

有人知道发生了什么吗?

【问题讨论】:

标签: javascript floating-point numbers comparison


【解决方案1】:

事实证明 .toFixed() 返回字符串 - 尝试在比较值之前添加 parseFloat 以查看结果:

console.log(parseFloat(value) < parseFloat(max)); // ---- now true

【讨论】:

  • 如果我是你,我不会这样做。试试这个找出原因;)console.log(parseFloat(6760/100*100) &lt; parseFloat(6760));在下面查看我的完整答案stackoverflow.com/a/55164784/1737158
  • 不工作!我的例子:javascript 3 === 2.999999999999999999 =&gt; true parseFloat(3) === parseFloat(2.999999999999999999) =&gt; true
  • JavaScript 在比较浮点数方面很奇怪——我建议要么完全避免它们(如果可能)或使用第三方解决方案。这是一个很好的阅读 - dev.to/alldanielscott/…
【解决方案2】:

您应该始终对浮点数进行舍入,否则在某些情况下会得到奇怪的结果。

试试这个看看问题:console.log(parseFloat(6760/100*100));

四舍五入,你会得到正确的结果:

console.log(Math.round(parseFloat(value)*100000) < Math.round(parseFloat(max)*100000));

或者你可以尝试使用类似的东西:http://mikemcl.github.io/decimal.js/

浮点数不是精确的数字,它们是数字的近似表示。

其实很简单。当你有一个以 10 为基础的系统时(比如 我们的),它只能表示使用一个素因子的分数 根据。 10 的质因数是 2 和 5。所以 1/2、1/4、1/5、1/8 和 1/10 都可以清楚地表达,因为分母都使用 10 的质因数。相反,1/3、1/6 和 1/7 都是重复的 小数,因为它们的分母使用 3 或 7 的质数因子。在 二进制(或以 2 为底),唯一的素数是 2。所以你只能 清晰地表达仅包含 2 作为主要因素的分数。在 二进制、1/2、1/4、1/8 都可以清楚地表示为小数。 而 1/5 或 1/10 将重复小数。所以 0.1 和 0.2 (1/10 和 1/5) 以 10 为底的系统中的干净小数正在重复 计算机正在运行的以 2 为底的系统中的小数。当您 对这些重复的小数做数学运算,你会得到剩菜 当您转换计算机的基数 2(二进制)时,它会结转 数字转换为更易于阅读的以 10 为基数的数字。 Source


这是not JavaScript's issue。这是因为计算机真的只理解 1 和 0。

如果您想深入探讨该主题,我建议您以此为起点:https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 2017-12-13
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多