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