不用Math.round()和toFixed():按需保留三位小数的实现方法问询
实现除法结果按需保留三位小数的替代方案(不用Math.round()和toFixed())
嘿,这个需求太常见了——既要保证最多显示三位小数,又不想在不需要的时候带多余的0或者小数点。除了大家常用的Math.round()和toFixed(),这里有几个实用的替代方法,完全满足你的需求:
方法1:正则表达式字符串处理
这种方式直接把除法结果转成字符串,用正则精准清理掉末尾无意义的0和多余的小数点,代码简洁直观:
function formatDivision(num1, num2) { const result = num1 / num2; // 先转成字符串,再用正则逐步处理 return result.toString() .replace(/(\.\d*?[1-9])0+$/, '$1') // 保留到最后一个非0小数位,去掉后续的0 .replace(/\.0+$/, '') // 处理小数部分全是0的情况 .replace(/\.$/, ''); // 如果最后只剩孤立的小数点,直接去掉 }
测试你的示例:
formatDivision(100, 30)→"3.333"formatDivision(390, 100)→"3.9"(如果你的需求是要显示3.90,可以调整逻辑,比如判断小数位长度,不足2位时补0)formatDivision(100, 100)→"1"
方法2:使用toLocaleString()配置格式化
这个方法利用JS内置的国际化格式化API,通过参数控制小数位数,不用自己写复杂逻辑:
function formatDivision(num1, num2) { const result = num1 / num2; return result.toLocaleString('en-US', { minimumFractionDigits: 0, // 最小小数位0位 maximumFractionDigits: 3, // 最大小数位3位 useGrouping: false // 禁用千分位分隔符 }); }
原生API的优势是边界情况处理更稳妥,输出结果完全符合“仅在必要时保留三位小数”的要求。
方法3:手动拆分整数和小数部分处理
如果你想完全掌控每一步逻辑,不想依赖正则或内置API,可以手动拆分字符串的整数和小数部分,按需截取和清理:
function formatDivision(num1, num2) { const result = num1 / num2; const [integerPart, decimalPart = ''] = result.toString().split('.'); // 没有小数部分直接返回整数 if (!decimalPart) return integerPart; // 截取最多三位小数 let trimmedDecimal = decimalPart.slice(0, 3); // 去掉末尾的0 trimmedDecimal = trimmedDecimal.replace(/0+$/, ''); // 清理后无小数则返回整数,否则拼接结果 return trimmedDecimal ? `${integerPart}.${trimmedDecimal}` : integerPart; }
这种方式灵活性最高,你可以随时调整规则——比如如果390/100需要输出3.90,只需要在清理后加一步:trimmedDecimal = trimmedDecimal.padEnd(2, '0')即可。
内容的提问来源于stack exchange,提问作者Muhaimin CS
相关产品推荐
相关产品推荐

