toFixed(n)`和`Math.round()

toFixed(n)Math.round()

JavaScript 在处理浮点数运算时可能会出现精度问题,这是由于它内部使用 IEEE 754 双精度浮点数来表示数字,包括小数。当您进行加法或其他算术运算时,尤其是涉及到小数时,这些精度问题可能导致非常接近但不完全等于预期结果的答案。

在您的情况中,item.boxNumber 的值为 1.4,当这个值被多次加起来时,理论上的结果应该是一个准确的值,但由于浮点数的表示方式,结果却是 36.399999999999984,而不是预期的 36.4

为了解决这个问题,您可以在每次累加后立即修正计算结果的精度,或者仅在最终结果中修正精度。一个常见的做法是使用 Number.prototype.toFixed() 方法或者是 Math.round() 方法来将结果四舍五入到您想要的小数位数。然而,这两种方法都有它们的局限性和使用场景,所以选择哪一种取决于您的具体需求。

使用 toFixed(n)

toFixed(n) 方法可以将数字四舍五入到 n 位小数,并以字符串形式返回结果。如果您想要得到一个数字类型的结果,可以将结果再次转换为数字:

const total = this.boxData.reduce((pre, next) => {
  if (row.palletCode === next.palletCode) {
    return pre + (next.boxNumber ? next.boxNumber : 0);
  }
  return pre;
}, 0);

const correctedTotal = Number(total.toFixed(2)); // 修正到两位小数

使用 Math.round()

如果您希望结果更加精确地控制四舍五入的方式,可以使用 Math.round(),但您需要先将数值按照希望保留的小数位数进行缩放:

const total = this.boxData.reduce((pre, next) => {
  if (row.palletCode === next.palletCode) {
    return pre + (next.boxNumber ? next.boxNumber : 0);
  }
  return pre;
}, 0);

const correctedTotal = Math.round(total * 100) / 100; // 修正到两位小数

toFixed(n)Math.round() 方法都是用来处理数字的四舍五入,但它们之间有一些关键的区别:

toFixed(n)

  1. 返回值类型toFixed(n) 方法返回的是一个字符串,而不是一个数字。如果你需要一个数字类型的结果,你可能需要再次将字符串转换为数字,例如使用 Number() 函数。
  2. 小数位数:这个方法会将数字四舍五入到指定的小数位数 n。即使原始数字的小数位数少于 n,返回的字符串也会用零填充到 n 位小数。
  3. 精度toFixed(n) 对于非常大或非常小的数字,可能不会像你预期的那样工作,因为它处理的是字符串表示,可能会涉及到科学记数法等问题。

Math.round()

  1. 返回值类型Math.round() 方法返回的是一个数字,这在大多数情况下可能是你期望的结果类型。
  2. 操作方式Math.round() 默认情况下只能四舍五入到最接近的整数。如果你需要四舍五入到特定的小数位数,你需要先将数字按照希望保留的小数位数进行缩放(例如乘以 10^n),四舍五入后再缩放回来(除以 10^n)。
  3. 精度:由于 Math.round() 是直接在数字上操作,而不是在字符串表示上操作,所以它在处理非常大或非常小的数字时通常更准确。

总结

  • 使用 toFixed(n) 当你需要结果有固定的小数位数,尤其是在格式化数字为字符串表示时(如财务计算),但记得它返回的是字符串。
  • 使用 Math.round() 当你需要更精确地控制数字的四舍五入,特别是在计算中需要继续使用四舍五入后的数字作为数字类型时。

选择哪种方法取决于你的具体需求,包括你希望结果的类型(字符串还是数字)、需要四舍五入到哪一位,以及对精度的要求。

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值