JavaScript中0.95-0.05为何得0.8999999999999999?如何得到0.90?
JavaScript中0.95-0.05结果异常的原因与解决方法
原因
JavaScript采用IEEE 754双精度浮点数标准存储数值,而大部分十进制小数无法被二进制浮点数精确表示。比如0.95和0.05转成二进制时都是无限循环的近似值,两者相减后,这种近似误差被放大,最终得到接近0.9但带有尾差的0.8999999999999999。
解决方法
转整数运算
将小数放大为整数计算后再缩小,从根源避免浮点误差:
(0.95 * 100 - 0.05 * 100) / 100 // 输出 0.9
使用toFixed()格式化
指定保留的小数位数,返回字符串后可转成数值:
Number((0.95 - 0.05).toFixed(2)) // 输出 0.9
用Math.round()四舍五入
针对需要精确到某一位的场景,通过放大后取整再缩小:
Math.round((0.95 - 0.05) * 100) / 100 // 输出 0.9
利用Number.EPSILON判断近似值
如果仅需判断结果是否接近预期值,可通过比较差值是否小于浮点数精度阈值:
const result = 0.95 - 0.05; if (Math.abs(result - 0.9) < Number.EPSILON) { // 视为等于0.9 }
内容的提问来源于stack exchange,提问作者Davide C
相关产品推荐
相关产品推荐

