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

使用小数位数选项,灵活控制数字是否显示末尾零。

简介

在格式化数字时,有些值在小数点后会自然出现末尾零。例如,1.5 可能显示为 1.50,3 可能显示为 3.00。对于需要统一显示分角的价格来说,这些末尾零很有意义,但在展示统计数据或测量值时则显得多余。

JavaScript 的 Intl.NumberFormat 允许你控制是否显示末尾的零。你可以根据需求配置格式化器来去除、保留这些零,或应用不同的规则。

什么是末尾零

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

// These numbers have the same value but different trailing zeros
1.5   // No trailing zeros
1.50  // One trailing zero
1.500 // Two trailing zeros

当你指定要显示的小数位数时,如果数字的有效位数少于指定的小数位数,格式化器会自动补零以填满剩余位置。

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

默认情况下,Intl.NumberFormat 最多显示 3 位小数,并会去除末尾的零。这意味着大多数数字不会显示多余的零。

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

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

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

console.log(formatter.format(1.123456));
// Output: "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));
// Output: "1.50"

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

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

minimumFractionDigitsmaximumFractionDigits 设置为相同的值时,每个数字都会精确显示该数量的小数位。位数不足的数字会补零,位数多的会四舍五入。

去除尾随零

要去除末尾的零,将 minimumFractionDigits 设为 0,maximumFractionDigits 设为你希望允许的最大小数位数。这样格式化器会根据需要显示 0 到 N 位小数。

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

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

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

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

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

格式化器会将整数显示为不带小数点的形式,带一位小数的数字原样显示,并去除本应出现的尾随零。如果小数位数超过最大限制,数字会被四舍五入。

设置大于零的最小值

你可以将 minimumFractionDigits 设为大于 0 的值,同时允许去除多余的末尾零。这样可以保证始终显示至少一定数量的小数位,但多余的零会被去除。

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

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

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

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

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

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

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

何时保留尾随零

当你需要所有数字都显示一致的精度时,应保留尾随零。这在价格、金额和需要通过小数位数表达精度的计量场景中很常见。

// Prices should show consistent decimal places
const priceFormatter = new Intl.NumberFormat("en-US", {
  style: "currency",
  currency: "USD",
  minimumFractionDigits: 2,
  maximumFractionDigits: 2
});

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

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

货币格式化器默认采用这种方式。所有金额都精确显示为 2 位小数,便于比较,并强调这些是货币数值。

何时移除末尾零

在显示统计数据、百分比、测量值或任何末尾零不再提供信息的数值时,应移除末尾零。这样可以让输出更简洁、更易读。

// Statistics look cleaner without trailing zeros
const statsFormatter = new Intl.NumberFormat("en-US", {
  minimumFractionDigits: 0,
  maximumFractionDigits: 2
});

console.log(`Average: ${statsFormatter.format(3.5)} items`);
// Output: "Average: 3.5 items"

console.log(`Total: ${statsFormatter.format(100)} items`);
// Output: "Total: 100 items"

// Percentages often work better without trailing zeros
const percentFormatter = new Intl.NumberFormat("en-US", {
  style: "percent",
  minimumFractionDigits: 0,
  maximumFractionDigits: 1
});

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

console.log(percentFormatter.format(0.755));
// Output: "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));
// Output: "1,234.5"

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

两种格式化器都会移除末尾零,并以一位小数显示数字。不同之处在于,美式英语格式用句点作小数点、逗号作千位分隔符,而德语格式则相反。