警报(5.30 / 0.1);
这会52.99999999999999
,但应为53
。任何人都可以说出如何以及为什么?
我想找到一个数字可以被给定的数字整除。请注意,其中一个数字可能是浮点数。
答案 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。