JS中使用Math.round(x)来替代toFixed()四舍五入保留1位小数点精度不准确的解决方法

在微信小程序开发中,处理订单总价时,直接使用toFixed(1)可能导致四舍五入错误。本文分享了一种利用Math.round()函数结合乘除操作,实现正确四舍五入保留小数的方法。

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

上个月接了一个微信小程序的小活,在开发完毕上线的时候遇到了一个问题,特此记录下来。

在当时其中一个需求是:客户下单时,单价和数量存在两位小数,但总价需要保留一位小数,且需要四舍五入,最先开始在小程序页面的js中使用toFixed(1)函数保留一位小数并四舍五入,经测试没问题,能够正常使用。

但在实际生产环境中,订单量增多的情况下总价会出现很多种比如1.65,22.85等小数点第二位是5的情况下就会发现保留1位小数后并没有四舍五入,得到的值是1.6和22.8,究其原因还是怪自己测试的时候数据量不够全面。

发现问题总是要解决的,查找了很多关于四舍五入的资料发现这方面好像很少有人遇到过这个问题,后来自己改了代码,决定不用toFixed()函数来进行四舍五入保留一位小数了。使用Math.round(x)来进行数值转换。

Math.round(x)中round() 方法可把一个数字舍入为最接近的整数。比如2.5 将舍入为 3,而 -2.5 将舍入为 -2。

那么保留一位小数的情况下我们该如何使用?如下所示:

var f = Math.round(totalPrice * 10) / 10

先将所得的总价先乘以10,然后使用Math.round()函数取最接近的整数后,再除以10就可以得到正确的值了。如1.65*10=16.5,取整后为17,再除以10就得到了1.7,保留1位小数又能够四舍五入了,同理保留两位小数也一样先乘以100取整后再除以100就行了。

在 JavaScript 中实现四舍五入保留小数,有多种方法可以使用,以下是一些常用且有效的实现方式: ### 使用 `Math.round()` 和 `toFixed()` 通过结合 `Math.round()` 和 `Number.EPSILON` 来避免浮点数计算误差,并使用 `toFixed(2)` 确保结果始终保留小数。该方法适用于大多数常规场景。 ```javascript function roundToTwo(num) { return (Math.round((num + Number.EPSILON) * 100) / 100).toFixed(2); } console.log(roundToTwo(3.14159)); // 输出: "3.14" console.log(roundToTwo(2.71828)); // 输出: "2.72" ``` ### 使用 `parseFloat()` 和 `toFixed()` 如果需要返回数字类型而非字符串,可以使用 `parseFloat()` 将 `toFixed(2)` 的结果转换为数字[^5]。 ```javascript function roundToTwoDecimalPlaces(number) { return parseFloat(number.toFixed(2)); } console.log(roundToTwoDecimalPlaces(123.456)); // 输出: 123.46 console.log(roundToTwoDecimalPlaces(123.4)); // 输出: 123.40 console.log(roundToTwoDecimalPlaces(123)); // 输出: 123.00 ``` ### 自定义函数处理进逻辑 如果你希望手动控制第三小数的进逻辑,可以使用 `parseInt()` 和条件判断来实现[^3]。 ```javascript var num = parseFloat(prompt("请输入一个小数")); var n = num * 1000 % 10; if (n >= 5) { num = parseInt(num * 100 + 1) / 100; } else { num = parseInt(num * 100) / 100; } alert(num); // 输出四舍五入后的结果 ``` ### 使用 `Math.floor()` 和 `Math.pow()` 通过将数值乘以 100 后加上 0.5 进行取整,再除以 100,可以实现四舍五入效果[^4]。 ```javascript let number = 3.1415926; let roundedNumber = Math.floor(number * Math.pow(10, 2) + 0.5) / Math.pow(10, 2); console.log(roundedNumber); // 输出: 3.14 ``` ### 返回字符串格式的结果 如果只需要字符串形式的结果而需要数值运算,可以直接使用 `toFixed(2)` 方法。 ```javascript function roundToTwoDecimalPlaces(number) { return number.toFixed(2); } console.log(roundToTwoDecimalPlaces(123.456)); // 输出: "123.46" console.log(roundToTwoDecimalPlaces(123.4)); // 输出: "123.40" console.log(roundToTwoDecimalPlaces(123)); // 输出: "123.00" ``` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值