js小数点保留时的四舍五入问题的处理

本文探讨了在处理价格展示时遇到的小数点后位数问题,特别是在进行打折后的价格处理。介绍了如何使用自定义函数实现真正的四舍五入,避免了原生toFixed方法在不同设备上可能产生的精度误差。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现今很多网站在展示价格的时候都是保留两位来显示,这似乎已经成了一个惯例,在日常开发中,我们也经常会遇到这种问题,一般的数据都是比较正常的,比如$25,我们让它展示成$25.00,$25.5我们让它展示成$25.50,数据存在多样性,运营人员一般肯定不会设置大于两个小数位的价格,但是如果再打个折呢?那就可能存在3位消暑甚至更多位小数,这个时候就会存在一个取舍的问题。

比如$25.554我们需要让它展示成$25.55,$25.556我们需要让它展示成$25.56,四舍五入嘛,但是据说银行对于价格在保留小数时的处理是4、5舍6入,也就是说$25.555实际展示的是$25.55而不是我们预想的$25.56,而且我们使用js的toFixed方法保留小数点似乎也是和银行遵循同样一个规则。$25.555在某些电脑上通过数字原生的toFixed方法保留小数点之后,实际得到的是$25.55,但是有时候我们就要展示真正的四舍五入怎么办呢?为了每个设备的统一,我们就需要造一个能真正做四舍五入保留小数位的函数,我们现将代码贴出来,再简单的说明一下:

function round(num, decimal) {
    if (isNaN(num)) {
        return 0;
    }
    const p1 = Math.pow(10, decimal + 1);
    const p2 = Math.pow(10, decimal);
    return Math.round(num * p1 / 10) / p2;
}
 
function toFixed(num, decimal) {
    return round(num, decimal).toFixed(decimal);
}

上面有两个函数,round函数用于处理保留小数位时的四舍五入,返回结果是一个数字,所以我们还需调用toFixed方法来保留小数位。

对比一下看看效果:

2.555.toFixed(2); // 2.55
toFixed(2.555, 2); // 2.56

我们分别使用了原生的toFixed方法和我们自己编写的toFixed方法对2.555做保留两位小数位处理,在我电脑上显示的结果是不一样的,但是在有些电脑上结果可能是一样的。

然后我们在回到上面的round函数,p1、p2分别是什么意思呢?这个解释起来不太好说明,我们看一个演算就知道了:

2.555保留两位小数我们可以这样做:Math.round(2.555 * 1000 / 10) / 100,也许有朋友会疑惑,为什么不直接Math.round(2.555 * 100) / 100呢?而是先多乘一个10然后再除掉,因为这里涉及一个小数点精度问题,如果我们在控制台输入:

0.555 * 100

我们会发现结果并不是55.5,而是255.50000000000003,有些电脑可能是255.4999999999999999,总之不是一个整的,所以为了避免在我们保留到的小数位处出现精度问题,我们会乘一个10的需要保留小数位加1次幂的数然后再把多乘的10除掉,具体的值也就是上面的p1,然后我们再还原数就得到了最后的结果。

本文转载自:https://www.deanhan.cn/js-float-round.html

### 实现 Vue.js保留两位小数而不进行四舍五入 为了在 Vue.js 项目中实现保留两位小数但不进行四舍五入的功能,可以采用自定义方法来处理数值。下面提供了一种解决方案,这种方法能够确保数值被截断到所需的精度而不会发生任何类型的舍入。 #### 自定义函数 `truncateToTwoDecimals` 此函数接收一个数字参数并返回一个新的字符串表示形式,该字符串精确到小数点后两位且不做任何舍入操作: ```javascript function truncateToTwoDecimals(num) { const numStr = Math.abs(num).toString(); let result; if (numStr.includes('.')) { const parts = numStr.split('.'); result = `${parts[0]}.${parts[1].slice(0, 2)}`; } else { result = `${numStr}.00`; } return Number(result) * Math.sign(num); } ``` 对于负数情况,`Math.sign()`用于保持原始符号;而对于正数或零,则直接应用上述逻辑[^1]。 另外一种更简洁的方式是利用 JavaScript 的内置功能配合一些简单的数学运算完成同样的效果: ```javascript function truncateToFixed(value, precision = 2) { var power = Math.pow(10, precision); return Math.trunc(value * power) / power; } ``` 这段代码通过乘以 \(10^n\) (其中 n 是期望的小数位数),然后使用 `Math.trunc()` 来移除多余的部分最后再除回原来的倍率从而达到目的[^3]。 当涉及到货币或者其他对精度有严格要求的数据展示,推荐使用第二种方式因为它更加可靠并且不容易受到不同浏览器间差异的影响[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值