浮点数对整数取余出现异常余数的原因是什么?
为什么浮点数取余会出现额外的精度误差?
这个问题其实是二进制浮点数的固有精度限制导致的,不少刚接触编程的朋友都会碰到这个困惑,我给你拆解清楚:
咱们日常用的十进制小数,比如0.1233,在转换成计算机依赖的二进制小数时,没办法被精确表示——就像你用十进制永远写不完1/3的无限循环小数0.3333...一样,有些十进制小数转成二进制后也是无限循环的,计算机只能截取一个近似值存在内存里。
你定义的x = 123.1233,看起来是精确的数值,但实际上计算机内部存储的并不是严格的123.1233,而是一个极其接近它的二进制近似值。当你执行x%1提取小数部分时,这个近似值的小数部分就会和你预期的0.1233有微小偏差,最终就出现了那个看起来奇怪的0.12330000000000041。
你可以做个小验证:在Python里用更高精度的格式打印x,就能看到它的真实面貌:
x = 123.1233 print("{0:.20f}".format(x)) # 输出会是类似 123.12330000000000410372 的结果
如果需要避免这种精度误差,进行精确的十进制运算,可以用Python标准库的decimal模块,它专门处理高精度的十进制计算:
from decimal import Decimal x = Decimal('123.1233') print(x % 1) # 输出 Decimal('0.1233')
内容的提问来源于stack exchange,提问作者harshil9968
相关产品推荐
相关产品推荐

