正负数值的自定义四舍五入函数开发问题求助
实现支持正负数值的精确两位小数四舍五入函数
需求说明
输入与预期输出如下:
| 输入 | 输出 |
|---|---|
| -1.8550 | -1.86 |
| 1.8550 | 1.86 |
| -1384.8540 | -1384.85 |
| 1384.8540 | 1384.85 |
| -1384.8550 | -1384.86 |
| -1384.8560 | -1384.86 |
| -3203.8640 | -3203.86 |
原代码问题分析
你当前的代码存在几个关键问题:
- 字符串拆分逻辑不可靠:把数值转字符串拆分整数和小数部分的方式,在处理整数、极小数值时会出错;而且拼接时会触发字符串相加(比如
1 + "0.86"会变成"10.86",而非预期的1.86)。 toFixed返回值处理错误:pntedDecimal.toFixed(2)返回的是字符串类型,直接和数值类型的numericalPart相加会导致结果完全错误。- 返回类型不一致:else分支返回字符串类型,正常分支返回数值类型,导致函数返回值类型不统一。
修复后的实现方案
下面是能满足需求的代码,核心思路是先解决浮点数精度问题,再基于绝对值做四舍五入,最后恢复原数值的符号:
function customRoundOff(value) { // 先将数值转为精确到三位小数的数字,规避JS浮点数精度丢失问题 const preciseValue = Number(value.toFixed(3)); // 取绝对值处理四舍五入,确保正负数值的舍入逻辑一致 const absoluteValue = Math.abs(preciseValue); // 四舍五入到两位小数:乘以100后取整,再除以100 const roundedAbs = Math.round(absoluteValue * 100) / 100; // 恢复原数值的符号 return roundedAbs * Math.sign(value); } // 测试用例验证 console.log(customRoundOff(-1.8550)); // -1.86 console.log(customRoundOff(1.8550)); // 1.86 console.log(customRoundOff(-1384.8540)); // -1384.85 console.log(customRoundOff(1384.8540)); // 1384.85 console.log(customRoundOff(-1384.8550)); // -1384.86 console.log(customRoundOff(-1384.8560)); // -1384.86 console.log(customRoundOff(-3203.8640)); // -3203.86
代码说明
- 浮点数精度处理:JavaScript中
1.855实际存储为1.8549999999999999,直接用Math.round会得到错误结果,通过value.toFixed(3)先转为精确的三位小数字符串再转数字,能规避这个问题。 - 绝对值统一处理:对绝对值做四舍五入后再恢复符号,避免负数的舍入逻辑出现异常。
- 统一返回类型:所有分支都返回数值类型,保证函数返回值的一致性。
内容的提问来源于stack exchange,提问作者Harish Puli
相关产品推荐
相关产品推荐

