javascript分区给出了错误的答案?

时间:2013-03-13 10:59:37

标签: javascript

  

警报(5.30 / 0.1);

这会52.99999999999999,但应为53。任何人都可以说出如何以及为什么?

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

5 个答案:

答案 0 :(得分:9)

出于同样的原因

0.1 * 0.2 //0.020000000000000004

有些十进制数不能用IEEE 754表示,这是JavaScript使用的数学表示法。如果你想在你的问题中使用这些数字进行算术运算,最好将它们相乘,直到它们首先是整数,然后除以它们。

答案 1 :(得分:7)

将数字缩放为整体。然后模拟结果。

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

答案 2 :(得分:0)

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

然后写一个函数:

  • 如果它是浮动的
    • 缩放数字
  • 返回数字
  • 的可分性的布尔表示

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库可能是个好主意 如果你想测试浮动的可分性

答案 3 :(得分:-1)

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

答案 4 :(得分:-1)

您可以通过以下方式获得: var num =(5.30 / 0.1); 警报(num.toFixed(2));

这将给你53.00。