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