带0-2位小数的浮点数:Number.parseFloat((x+y).toFixed(2))是否恒等于z?
问题解答
加法场景:表达式始终成立
当x、y、z是0-2位小数,且x+y的十进制精确等于z,同时数值在Number.MIN_VALUE到Number.MAX_VALUE范围内时,Number.parseFloat((x+y).toFixed(2)) == z始终成立。
原因在于:0-2位小数的十进制数转换为双精度浮点数时,误差量级仅为1e-16级别,远小于toFixed(2)舍入的最小步长0.005。x+y的浮点计算结果与真实十进制值z的差距极小,toFixed(2)会正确将其舍入到z的两位小数形式,转换为Number后与z完全相等。
减法场景:表达式始终成立
与加法逻辑完全一致:x-y的浮点计算误差同样远小于0.005,toFixed(2)会精准舍入到十进制结果z的两位小数形式,最终转换后与z相等。
乘法场景:表达式始终成立
即使x*y的浮点结果存在精度误差,误差量级仍远小于0.005。toFixed(2)的舍入规则会将结果修正为z的两位小数形式,转换为Number后与z相等。
示例代码:
console.log(0.3 * 0.3); // 输出0.08999999999999999 console.log(Number.parseFloat((0.3*0.3).toFixed(2)) == 0.09); // 输出true
除法场景:表达式始终成立
排除除以0的情况后,x/y的浮点计算误差同样远小于0.005,toFixed(2)会正确舍入到十进制结果z的两位小数形式,转换后与z相等。
示例代码:
console.log(0.06 / 0.2); // 输出0.29999999999999993 console.log(Number.parseFloat((0.06/0.2).toFixed(2)) == 0.3); // 输出true
不存在不成立的情况
所有符合前提条件的场景下,该表达式均成立。因为0-2位小数的数值在双精度浮点数中的精度误差远不足以触发toFixed(2)舍入到错误的两位小数结果。
内容的提问来源于stack exchange,提问作者displaydisplayname
相关产品推荐
相关产品推荐

