为何取模运算返回异常结果?1 % .01未得到预期0值
为什么
1 % .01返回0.01而不是0? 这是个非常典型的浮点数精度陷阱问题,我来给你拆解明白~
首先先纠正一个小误解:1除以0.01其实是100次(不是你说的10次),理论上整除的话取模结果确实应该是0,但问题出在计算机对小数的存储方式上。
计算机是用二进制来存储浮点数的,而十进制的0.01转换成二进制是一个无限循环的小数——就像我们用十进制没法精确表示1/3(0.333...)一样,二进制也没法精确表示0.01。所以你在代码里写的.01,实际存储在计算机里的是一个非常接近0.01的近似值,比如大概是0.01000000000000000020816681711721685132943093776702880859375。
当计算1 % .01时,计算机其实是在做「1减去这个近似值的最大整数倍」的运算。这个近似值的99倍大概是0.99000000000000002059766447353834819793701171875,用1减去这个数得到的结果是0.0099999999999999794,但因为浮点数的精度显示规则,这个值会被近似显示为0.01,这就是你看到的结果。
你可以自己验证一下:比如在Python里执行format(0.01, '.20f'),就能看到它的真实存储值;或者计算1 - 99 * 0.01,得到的结果就是这个误差值,而取模运算本质上就是这个逻辑。
总结来说:问题的核心是二进制浮点数无法精确表示十进制的0.01,微小的存储误差导致了取模运算的结果不符合你的预期。
内容的提问来源于stack exchange,提问作者user2242044
相关产品推荐
相关产品推荐

