我想了解使用Intl.NumberFormat.prototype.format()时隐式发生的小数舍入行为。format函数的MDN文档缺少对该行为的清晰描述。
让我们以下面这段代码为例:
const amount = 654321.985;
const formattedAmount = new Intl.NumberFormat('en-EN', {
style: 'currency',
currency: 'EUR',
}).format(amount);
console.log(formattedAmount); // => €654,321.99
在这种情况下舍入策略是什么?它依赖于什么?我认为这其中有很多因素,比如浏览器、语言环境和货币,但我找不到确切的证据。
在摆弄了这个示例之后,我可以看到小数点部分被四舍五入了一个美分,而下面的部分则向下,即.9849
变成了.98
。该策略似乎遵循了nearest integer, ties to even
规则。同时,我理解在ECMAScript规范下,逻辑可能会更复杂。
MDN示例如下:
Intl.NumberFormat('en-EN', {
style: 'currency',
currency: 'EUR',
}).resolvedOptions()
// properties
currency: "EUR"
currencyDisplay: "symbol"
currencySign: "standard"
locale: "en"
maximumFractionDigits: 2
minimumFractionDigits: 2
minimumIntegerDigits: 1
notation: "standard"
numberingSystem: "latn"
signDisplay: "auto"
style: "currency"
useGrouping: true
__proto__: Object
你们在第13.2节和13.3节提供的TC39文档看起来非常有用:
// typing Intl.NumberFormat in console results takes you nowhere, but
// typing `Intl.NumberFormat.prototype` in console results in:
constructor: ƒ NumberFormat()
format:
formatToParts: ƒ formatToParts()
resolvedOptions: ƒ resolvedOptions()
Symbol(Symbol.toStringTag): "Intl.NumberFormat"
get format: ƒ format()
13.3.3内部槽:
必须是包含子字符串"{number}"的字符串值。"positivePattern"必须包含子字符串"{plusSign}"但不是"{minusSign}">
图案的形状似乎是positivePattern = "{plusSign}{number}">
也在13.4.5处达到峰值Intl.NumberFormat.prototype.resolvedOptions ():
[[MinimumIntegerDigits]] "minimumIntegerDigits"
[[MinimumSignificantDigits]] "minimumSignificantDigits"
[[MaximumSignificantDigits]] "maximumSignificantDigits"
还有,别忘了检查MDN:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat