精确处理小数位保留

《为什么 js 中的 0.1+0.2≠0.3,而 0.2+0.2=0.4?》文章中介绍过小数精度导致的问题,所以,当我们在 JavaScript 中处理小数点位数时,这种精度问题就会很常见,保障数据的处理结果不受精度的影响显得十分重要。

本文介绍一些简单而有效的解决方案,使用 toLocaleString 方法和自定义 toFixed 函数来解决数字精度问题。

toLocaleString 方法

JavaScript 中的 toLocaleString 方法可以将数字格式化为特定语言环境下的字符串,支持设置小数位数、数字分组符号等。例如,以下代码将数字 123456.789 格式化为一个带有千位分隔符的字符串:

const number = 123456.789;
console.log(number.toLocaleString('en-US')); // 123,456.789

使用 toLocaleString 方法的好处是可以避免由于使用浮点数计算而导致的精度问题。但是,默认情况下,toLocalString 方法会使用对数字进行千分位格式化,不过,我们可以自定义 toFixed 函数来解决。

自定义 toFixed 函数

自定义 toFixed 函数可以解决 toLocaleString 方法中数字分组符号的问题,并且可以确保保留指定的小数位数。以下是一个示例函数:

/**
 * 将数字转换为指定小数位数的字符串
 * @param num 要进行转换的数字
 * @param fractionDigits 要保留的小数位数
 */
function toFixed(num: number, fractionDigits: number) {
  return num.toLocaleString('en-US', {
    minimumFractionDigits: fractionDigits,
    maximumFractionDigits: fractionDigits,
    useGrouping: false,
  });
}

该函数使用 toLocaleString 方法将数字转换为指定小数位数的字符串。在该函数中,我们将语言设置为 en-US,然后使用 minimumFractionDigitsmaximumFractionDigits 属性将小数位数设置为 fractionDigits,从而保证数字保留指定的小数位数。通过指定 useGrouping 属性为 false,可以禁用数字分组符号(即千分位),确保输出的格式化数字与原始数字保持一致。

使用自定义的 toFixed 函数可以确保数字的精度和精确度,特别是在货币计算中非常重要。以下是一个示例:

const number = 123456.789;
const formattedNumber = toFixed(number, 2);
console.log(formattedNumber); // 123456.79

在上面的示例中,原始数字 123456.789 被转换为一个保留两位小数的字符串,输出结果为 123456.79,不受浮点数计算和数字分组符号的影响。

如果您觉得本文对您有用,欢迎捐赠或留言~
微信支付
支付宝

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注