【问题标题】:javascript division giving wrong answer? [duplicate]javascript部门给出错误答案? [复制]
【发布时间】:2013-03-01 06:33:45
【问题描述】:

警报(5.30/0.1);

这给出了52.99999999999999,但应该是53。任何人都可以告诉如何以及为什么?

我想找到一个数字可以被一个给定的数字整除。请注意,其中一个数字可能是浮点数。

【问题讨论】:

标签: javascript


【解决方案1】:

要查找数字 x 是否可以被数字 y 整除,您必须执行 x % y(取模)。如果结果为 0,则它是完全可整除的,任何其他都不是。

【讨论】:

  • 不幸的是,在这种情况下,这也会返回一个与0 不同的值。
【解决方案2】:

您可以通过以下方式获得它: 变量数 = (5.30/0.1); alert(num.toFixed(2));

这会给你 53.00。

【讨论】:

  • 问题是“我想找到一个数可以被给定数整除”,大概意思是“完全可整除”。如果您丢弃小数点后的所有内容,那么每个否定结果都将作为误报出现。
  • @Quentin 见第一行:这给出了 52.99999999999999 但应该是 53。谁能告诉我如何以及为什么?
  • ——见第二行。 “我想找出一个数能被给定数整除。”。您的答案仅针对第一行而未考虑上下文。上下文很重要。
【解决方案3】:

出于同样的原因

0.1 * 0.2 //0.020000000000000004

某些十进制数无法在 IEEE 754 中表示,这是 JavaScript 使用的数学表示。如果您想在问题中对这些数字进行算术运算,最好先将它们相乘,直到它们成为整数,然后再除以它们。

【讨论】:

    【解决方案4】:

    将数字缩放为整数。然后对结果取模。

    alert((5.30*10) % (0.1*10));
    

    【讨论】:

    • 这并不总是有效,以下情况:(1.5876 * 10000) % (0.0001 * 10000) 结果为 0.999999999998
    • @Trans 但(1.5876 * 100000) % (0.0001 * 100000) 可以
    【解决方案5】:

    现在您已经阅读了我评论的文章,​​您应该知道问题的根源。 您可以通过缩放浮动来部分解决这个问题...

    然后写一个函数:

    • 如果它是一个浮点数
      • 缩放数字
    • 返回数字整除性的布尔表示

    function isDivisable(n, d) {
        var ndI = 1 + "".indexOf.call(n, "."); //Index of the Number's Dot
        var ddI = 1 + "".indexOf.call(d, "."); // Index of the Divisors Dot
        if (ndI || ddI) { // IF its a float
            var l = Math.max(("" + n).length - ndI, ("" + d).length - ddI); //Longest Decimal Part
            var tmpN = (n * Math.pow(10, l)); //scale the float
            var tmpD = (d * Math.pow(10, l));
            return !~((tmpN % tmpD) - 1); //Substract one of the modulo result, apply a bitwise NOT and cast a boolean.
        }
        return !~((n % d) - 1); // If it isnt a decimal, return the result 
    }
    console.log(isDivisable(5.30, 0.1));//true
    

    这是JSBin

    不过……

    由于整数以 64 位精度存储,因此最大精度约为 (2^53), 当缩放更大的数字时,您很快就会超过最大精度。

    因此,为 javascript 获取某种 BigInteger 库可能是个好主意 如果你想测试浮点数的可分性

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      • 2014-11-19
      • 2020-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多