alert(5.30/0.1);javascript部分给出错误的答案?
这给出52.99999999999999
,但应该是53
。任何人都可以说出如何和为什么?
我想找到一个数字可以被给定的数字整除。请注意,其中一个数字可能是一个浮点数。
alert(5.30/0.1);javascript部分给出错误的答案?
这给出52.99999999999999
,但应该是53
。任何人都可以说出如何和为什么?
我想找到一个数字可以被给定的数字整除。请注意,其中一个数字可能是一个浮点数。
要查找某个数字x
是否可以被数字y
整除,则必须使用x % y
(模数)。如果结果为0,则它是完全可分的,其他则不是。
不幸的是,在这种情况下,这将返回一个与“0”不同的值。 – insertusernamehere 2013-03-13 11:05:10
您可以通过以下方式获取: var num =(5.30/0.1); alert(num.toFixed(2));
这会给你53.00。
对于
0.1 * 0.2 //0.020000000000000004
一些十进制数不能在IEEE 754,由JavaScript中使用的数学表示来表示同样的道理。如果你想在你的问题中用这些数字进行算术运算,最好将它们相乘,直到它们是整数,然后将它们分开。
现在你已经阅读了我评论的文章,你应该知道你的问题的根源。 您可以部分地解决,通过缩放你漂浮...
然后只写一个函数:
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), ,你很快就会超过最大精度的时扩大更大的数字。
所以它可能是一个好主意,得到某种BigInteger的图书馆为JavaScript 如果你想测试的float整除
[什么每台计算机科学家应该知道关于浮点运算(HTTP:// docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) – C5H8NNaO4 2013-03-13 11:02:08