2017-10-10 72 views
3

這一個真的讓我很困惑。意外的精確度()在Edge瀏覽器中的行爲

var a = 0.0003; 
var b = a.toPrecision(3); 

我期待b爲「0.000300」,這正是我在Firefox,IE和Chrome中所獲得的。但不是在邊緣。邊緣給了我「0.000200」。

任何人有任何想法是怎麼回事?

的jsfiddle這裏如果有人想看一看:http://jsfiddle.net/dajp/2b47qLg0/

(我使用的邊緣40.15063.0.0與EdgeHTML 15.15063如果有差別。)

非常感謝。

回答

1

這可能不是最好的方法,但它可以解決邊緣問題。

這僅僅是一個修改您的jsfiddle的JavaScript:

runWeirdness = function() { 
a = 0.0003; 
b = a.toFixed(3 + decimalPlaces(a)); 
document.getElementById("para").innerHTML = "Answer is: " + b; 
} 

function decimalPlaces(num) { 
    var match = (''+num).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/); 
    if (!match) { return 0; } 
    return Math.max(
     0, 
     // Number of digits right of decimal point. 
     (match[1] ? match[1].length : 0) 
     // Adjust for scientific notation. 
     - (match[2] ? +match[2] : 0)); 
} 

toFixed()toPrecision()之間的基本區別是toFixed(n)提供小數點後第n次的長度,同時toPrecision(x)提供X總長度,包括小數點前點。

+0

非常感謝...我自那以後又發現了另一種方法,它對於我的目的來說足夠準確,而且更簡單一點:如果我使用'toPrecision(a + a * 1e-6)'而不是'toPrecision(a )'然後Edge給出我期望的答案。因爲在我的應用程序中,我從來沒有將'a'設置爲0.02999997之類的東西,我認爲我可以逃避這一點,儘管這是一個可怕的陷阱,而且我仍然不明白爲什麼它首先發生。我更喜歡你的方法。 – dajp

+0

是的,如果所有的瀏覽器都是相同的,但Web開發人員的生活會更簡單,但卻不那麼有趣。 –

相關問題