2017-03-31 71 views
0

我想更好地理解爲什麼大數字可能具有較大的精度不一致處理,特別是在JavaScript和它的本地化設施(如ECMA-402/Intl)中。我假設這與浮點數的使用有關,但我想知道限制的位置和/或如何避免這些缺陷。Intl格式化大型浮點數

例如,使用Intl.NumberFormat:

console.log(new Intl.NumberFormat('en-US', { minimumFractionDigits: 3, maximumFractionDigits: 3 }).format(9999999999990.001)); // logs 9,999,999,999,990.000 

let test1 = 9999999999990.001 
console.log(test1); // logs 9999999999990.002 

我怎麼能揣摩出這些數字開始變得不一致?是否有某種限制?當我增加小數精度時,這種限制是否會發生變化? :

let test2 = 9999999999990.0004; 
console.log(test2) // logs 9999999999990 
+0

http://floating-point-gui.de/ –

回答

1

是否有某種限制?當我增加小數精度時,是否會限制變化?

是的,是的。 JavaScript中的浮點數本身存儲在64位空間中,這意味着它們可以表示的精度受到限制。有關更多信息,請參見this answer

我該如何弄清楚這些數字在哪裏開始變得不一致?

通過您的「數字文字」的功能,在字符串的形式,檢查,看看是否能串,當強制轉換爲一個號碼,回,返回正確的文字:

function safeNumber (s) { 
 
    if (String(+s) !== s) 
 
    throw new Error('Unsafe number!') 
 
    return +s 
 
} 
 

 
let safe = safeNumber('999999999999999') 
 
console.log(safe) 
 

 
let unsafe = safeNumber('9999999999990.001') 
 
console.log(unsafe)

+0

這很棒,內容翔實,但我真正想做的事情是提前瞭解這些「不安全」的數字。如果我使用Intl格式化貨幣格式,我需要知道,在哪一點上,我的價值觀不會反映它們的「真實」價值。換句話說,什麼適合64位空間(在十進制之後的小數和限制之前的限制)....除非我理解錯誤! – sparty02

+0

15位有效數字。請參閱http://stackoverflow.com/questions/1379934/large-numbers-erroneously-rounded-in-javascript/1380058#1380058。 – gyre