Intl.NumberFormat.prototype.format() 中的默认舍入策略
Default rounding strategy in Intl.NumberFormat.prototype.format()
我想了解使用 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
这种情况下的舍入策略是什么,它取决于什么?我假设涉及许多因素,例如浏览器、区域设置和货币,但找不到对此的确认。
在尝试了这个示例之后,我可以看到小数部分向上舍入了 1 分,向下舍入了任何低于 1 分的部分,即 .9849
变成了 .98
。该策略似乎遵循 nearest integer, ties to even
规则。同时,我了解到给定 ECMAScript specification.
逻辑可能会更复杂
来自 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 内部插槽:
must be string values that must contain the substring "{number}".
"positivePattern" must contain the substring "{plusSign}" but not
"{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
我想了解使用 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
这种情况下的舍入策略是什么,它取决于什么?我假设涉及许多因素,例如浏览器、区域设置和货币,但找不到对此的确认。
在尝试了这个示例之后,我可以看到小数部分向上舍入了 1 分,向下舍入了任何低于 1 分的部分,即 .9849
变成了 .98
。该策略似乎遵循 nearest integer, ties to even
规则。同时,我了解到给定 ECMAScript specification.
来自 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 内部插槽:
must be string values that must contain the substring "{number}". "positivePattern" must contain the substring "{plusSign}" but not "{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