如何去除小数点后的尾随零?

使用小数位选项控制数字是否显示尾随零。

介绍

在格式化数字时,一些值在小数点后自然会有尾随零。例如,数字 1.5 可能显示为 1.50,或者 3 可能显示为 3.00。这些尾随零在需要一致显示分位(如价格)时是有意义的,但在显示统计数据或测量值时看起来可能显得多余。

JavaScript 的 Intl.NumberFormat 提供了对尾随零显示的控制。您可以根据需要配置格式化器来移除它们、保留它们,或应用不同的规则。

什么是尾随零

尾随零是出现在数字小数点后末尾的零。它们不会改变数字的数学值,但会影响数字的显示方式。

// 这些数字的值相同,但尾随零不同
1.5   // 没有尾随零
1.50  // 一个尾随零
1.500 // 两个尾随零

当您指定显示的小数位数时,可能会出现尾随零。如果一个数字的有效位数少于您指定的小数位数,格式化器会添加零以填充剩余的位置。

Intl.NumberFormat 默认如何显示小数位

默认情况下,Intl.NumberFormat 显示最多 3 位小数,并移除尾随零。这意味着大多数数字会以没有多余零的形式显示。

const formatter = new Intl.NumberFormat("en-US");

console.log(formatter.format(1.5));
// 输出: "1.5"

console.log(formatter.format(1.50));
// 输出: "1.5"

console.log(formatter.format(1.123456));
// 输出: "1.123"

格式化器将 1.5 和 1.50 视为相同的值,并以相同的方式显示它们。小数位超过 3 位的数字会被四舍五入到 3 位。

设置最小和最大小数位数

minimumFractionDigitsmaximumFractionDigits 选项控制小数点后显示的位数。这两个选项共同决定是否显示尾随零。

const formatter = new Intl.NumberFormat("en-US", {
  minimumFractionDigits: 2,
  maximumFractionDigits: 2
});

console.log(formatter.format(1.5));
// 输出: "1.50"

console.log(formatter.format(1));
// 输出: "1.00"

console.log(formatter.format(1.234));
// 输出: "1.23"

minimumFractionDigitsmaximumFractionDigits 设置为相同的值时,每个数字都会以完全相同的小数位数显示。位数不足的数字会补充尾随零,而位数过多的数字会被四舍五入。

移除尾随零

要移除尾随零,将 minimumFractionDigits 设置为 0,并将 maximumFractionDigits 设置为您希望允许的小数位数的最大值。此配置指示格式化器显示 0 到 N 位小数,仅使用所需的位数。

const formatter = new Intl.NumberFormat("en-US", {
  minimumFractionDigits: 0,
  maximumFractionDigits: 2
});

console.log(formatter.format(1));
// 输出: "1"

console.log(formatter.format(1.5));
// 输出: "1.5"

console.log(formatter.format(1.50));
// 输出: "1.5"

console.log(formatter.format(1.23));
// 输出: "1.23"

格式化器会将整数显示为不带小数点的形式,将一位小数的数字按原样显示,并移除可能出现的尾随零。如果数字超过最大小数位数,仍会四舍五入。

设置大于零的最小值

您可以将 minimumFractionDigits 设置为大于零的值,同时仍允许移除尾随零。这确保了始终显示至少一些小数位,同时移除超过该最小值的零。

const formatter = new Intl.NumberFormat("en-US", {
  minimumFractionDigits: 1,
  maximumFractionDigits: 3
});

console.log(formatter.format(1));
// 输出: "1.0"

console.log(formatter.format(1.5));
// 输出: "1.5"

console.log(formatter.format(1.50));
// 输出: "1.5"

console.log(formatter.format(1.234));
// 输出: "1.234"

console.log(formatter.format(1.2345));
// 输出: "1.235"

数字 1 显示为 1.0,因为最小值是 1 位小数。数字 1.5 按原样显示。数字 1.50 的尾随零被移除。超过 3 位小数的数字会被四舍五入到 3 位。

何时保留尾随零

当需要在所有数字中显示一致的精度时,请保留尾随零。这在价格、财务金额和小数位数传递意义的测量值中很常见。

// 价格应显示一致的小数位数
const priceFormatter = new Intl.NumberFormat("en-US", {
  style: "currency",
  currency: "USD",
  minimumFractionDigits: 2,
  maximumFractionDigits: 2
});

console.log(priceFormatter.format(5));
// 输出: "$5.00"

console.log(priceFormatter.format(5.5));
// 输出: "$5.50"

货币格式化程序默认使用这种方法。两个金额都显示为精确的两位小数,使其易于比较,并强化了这些是货币值的概念。

何时移除尾随零

在显示统计数据、百分比、测量值或任何尾随零不提供信息的值时,请移除尾随零。这会使输出更简洁、更易读。

// 统计数据在没有尾随零时看起来更简洁
const statsFormatter = new Intl.NumberFormat("en-US", {
  minimumFractionDigits: 0,
  maximumFractionDigits: 2
});

console.log(`平均值: ${statsFormatter.format(3.5)} 项`);
// 输出: "平均值: 3.5 项"

console.log(`总计: ${statsFormatter.format(100)} 项`);
// 输出: "总计: 100 项"

// 百分比通常在没有尾随零时效果更好
const percentFormatter = new Intl.NumberFormat("en-US", {
  style: "percent",
  minimumFractionDigits: 0,
  maximumFractionDigits: 1
});

console.log(percentFormatter.format(0.75));
// 输出: "75%"

console.log(percentFormatter.format(0.755));
// 输出: "75.5%"

统计数据和百分比仅显示所需的小数位数。整数不显示小数点,而具有有意义小数位的数字则显示它们且没有不必要的尾随零。

地区如何影响小数显示

小数点的位置和数字分组字符因地区而异,但尾随零的规则在所有地区都相同。minimumFractionDigitsmaximumFractionDigits 选项在任何地区都具有相同的效果。

const formatterEN = new Intl.NumberFormat("en-US", {
  minimumFractionDigits: 0,
  maximumFractionDigits: 2
});

const formatterDE = new Intl.NumberFormat("de-DE", {
  minimumFractionDigits: 0,
  maximumFractionDigits: 2
});

console.log(formatterEN.format(1234.5));
// 输出: "1,234.5"

console.log(formatterDE.format(1234.5));
// 输出: "1.234,5"

两个格式化程序都移除了尾随零,并以一位小数显示数字。不同之处在于,美国英语格式使用句号作为小数点,逗号作为千位分隔符,而德语格式则相反。