我试图更好地理解为什么大数字和潜在的大精度处理不一致,特别是在JavaScript及其本地化工具(例如ECMA-402/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
是有某种限制吗?随着小数精度的增加,该限制会发生变化吗?
的,是的。JavaScript 中的浮点数本身存储在 64 位空间中,这意味着它们可以表示的精度受到限制。有关详细信息,请参阅此答案。
我如何能够找出这些数字开始不一致的地方?
将"数字文字"传递给字符串形式的函数,并检查该字符串在强制转换为数字并返回时是否返回正确的文字:
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)