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