如何实现满足全部指定测试用例的JS自定义四舍五入逻辑
问题原因
你现有的代码有两处核心问题:
- 直接对浮点数做乘除运算会存在精度误差,JS 中很多十进制小数无法被二进制精确表示,比如
0.045 * 100实际计算结果是4.499999999999999而非预期的4.5,会导致判断逻辑出错。 - 你的判断条件逻辑错误,原逻辑取
(num * 1000) % 100作为判断依据,实际我们只需要判断千分位的单个数字是否大于等于5,就能决定是否进位。
统一实现方案
我们可以先将数值放大1000倍后取整,消除浮点数精度误差,再根据千分位的值判断是否进位,一套逻辑即可覆盖所有测试用例:
function roundOff(num) { // 放大1000倍后四舍五入取整,消除浮点数运算精度误差 const scaled = Math.round(num * 1000); // 取千分位的数字 const thousandthDigit = scaled % 10; // 取乘以100后的整数部分 const integerPart = Math.floor(scaled / 10); // 千分位>=5则进位,否则直接返回整数部分 return thousandthDigit >= 5 ? integerPart + 1 : integerPart; } // 测试用例 document.write("Result for 0.045 :" + roundOff(0.045) + "<br>"); document.write("Result for 0.955 :" + roundOff(0.955) + "<br>"); document.write("Result for 0.995 :" + roundOff(0.995) + "<br>"); document.write("Result for 0.01 :" + roundOff(0.01) + "<br>"); document.write("Result for 0.1 :" + roundOff(0.1) + "<br>"); document.write("Result for 0.175 :" + roundOff(0.175) + "<br>"); document.write("Result for 0.007 :" + roundOff(0.007) + "<br>"); document.write("Result for 0.818 :" + roundOff(0.818) + "<br>");
所有测试用例运行结果和预期完全一致。
内容的提问来源于stack exchange,提问作者Ashwini
相关产品推荐
相关产品推荐

