2013-03-13 90 views
0

alert(5.30/0.1);javascript部分給出錯誤的答案?

這給出52.99999999999999,但應該是53。任何人都可以說出如何和爲什麼?

我想找到一個數字可以被給定的數字整除。請注意,其中一個數字可能是一個浮點數。

+6

[什麼每臺計算機科學家應該知道關於浮點運算(HTTP:// docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) – C5H8NNaO4 2013-03-13 11:02:08

回答

-1

要查找某個數字x是否可以被數字y整除,則必須使用x % y(模數)。如果結果爲0,則它​​是完全可分的,其他則不是。

+3

不幸的是,在這種情況下,這將返回一個與「0」不同的值。 – insertusernamehere 2013-03-13 11:05:10

-1

您可以通過以下方式獲取: var num =(5.30/0.1); alert(num.toFixed(2));

這會給你53.00。

+0

問題說「*我想找到一個數字可以被給定的數字整除*」,大概這意味着「完全可分」。如果丟棄小數點後的所有內容,則每個負面結果都會以誤報形式出現。 – Quentin 2013-03-13 11:05:52

+0

@Quentin看到第一行: 這給出52.99999999999999,但應該是53.任何人都可以告訴如何以及爲什麼? – 2013-03-13 11:08:53

+0

- 見第二行。 「*我想找到一個數字可以被給定的數字整除。*」。您的回答只處理第一行,而不考慮上下文。背景非常重要。 – Quentin 2013-03-13 11:30:30

9

對於

0.1 * 0.2 //0.020000000000000004 

一些十進制數不能在IEEE 754,由JavaScript中使用的數學表示來表示同樣的道理。如果你想在你的問題中用這些數字進行算術運算,最好將它們相乘,直到它們是整數,然後將它們分開。

7

將數字縮放成整體。然後模擬結果。

alert((5.30*10) % (0.1*10)); 
+0

這總是不起作用的情況如下: (1.5876 * 10000)%(0.0001 * 10000)結果爲0.999999999998 – Trans 2017-05-25 04:08:45

+0

@Trans但是(1.5876 * 100000)%(0.0001 * 100000)' – DickieBoy 2017-05-25 08:30:26

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), ,你很快就會超過最大精度的時擴大更大的數字。

所以它可能是一個好主意,得到某種BigInteger的圖書館爲JavaScript 如果你想測試的float整除