检查数字第四位小数是否为0时现有代码判定结果异常如何解决
问题原因
你遇到的是JavaScript双精度浮点数精度丢失的典型问题:
十进制小数转二进制存储时,大部分小数无法被精确表示,会出现微小的截断误差。比如
1.2570 * 10000实际计算结果不是精确的12570,而是12569.999999999998,取模10后结果不为0。而1.2580的二进制表示误差极小,乘10000后接近精确值,所以能通过校验。
解决方案
方案1:字符串处理法(最稳妥,完全避开浮点数运算误差)
直接把数值转为字符串提取第四位小数,适合所有常规数值场景:
function checkFourthDecimal(quantity) { // 拆分整数、小数部分 const [_, decimalPart = ''] = String(quantity).split('.'); // 小数位补0到至少4位 const fullDecimal = decimalPart.padEnd(4, '0'); // 取第四位(索引为3)判断 return fullDecimal[3] === '0'; } // 最终校验逻辑 !!(submission && checkFourthDecimal(quantity));
方案2:精度修正数学运算法(适合数值范围确定的场景)
对运算结果先做四舍五入消除精度误差,再做取模判断,代码更简洁:
!!(submission && (Math.round(quantity * 10000) % 10) === 0);
如果需要兼容极小误差场景,可以加上JS内置的精度常量修正:
!!(submission && (Math.round((quantity * 10000) + Number.EPSILON) % 10) === 0);
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

