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

javascript division giving wrong answer?

本问题已经有最佳答案,请猛点这里访问。

alert(5.30/0.1);

这给了52.99999999999999,但应该是53。有人知道怎么做和为什么吗?

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


因为同样的原因

1
0.1 * 0.2 //0.020000000000000004

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


将数字缩放为整数。然后求出结果的模。

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


既然你已经阅读了我评论的文章,你应该知道你问题的根源。你可以通过调整浮动比例来部分解决这个问题…

然后写一个函数:

  • 如果是浮球
    • 缩放数字
  • 返回数字可除性的布尔表示形式
1
2
3
4
5
6
7
8
9
10
11
12
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库可能是个好主意。如果要测试浮动的可分割性


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

这会给你53.00。


要想找出一个数x是否可以被一个数y除,你必须做x % y(modulo)。如果结果是0,那么它是完全可除的,而其他的则不是。