javascript division giving wrong answer?
本问题已经有最佳答案,请猛点这里访问。
alert(5.30/0.1);
号
这给了
我想知道一个数可以被一个给定的数整除。请注意,其中一个数字可能是浮点。
因为同样的原因
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。
要想找出一个数