Python3 Tkinter鼠标滚轮增减0.1出现精度异常问题排查
问题原因分析
先看你提供的代码:
import tkinter as tk def mouse_wheel(event): global count if event.delta == -120: count -= float(0.1) elif event.delta == 120: count += float(0.1) label["text"] = count count = float(0) root = tk.Tk() root.title("turn mouse wheel") root["bg"] = "darkgreen" root.bind("<MouseWheel>", mouse_wheel) label = tk.Label(root, font=("courier", 18, "bold"), width=10) label.pack(padx=40, pady=40) root.mainloop()
这个问题的核心是浮点数的二进制精度缺陷:
- 十进制的
0.1无法被二进制浮点数精确存储,它在二进制中是无限循环的小数,实际存储的是一个接近0.1的近似值。 - 每次执行
count += 0.1或count -= 0.1时,这个近似值的误差会不断累积。比如多次累加后,count的实际值可能变成0.30000000000000004或0.29999999999999993这类偏离预期的数值。 - 当直接把带有精度误差的浮点数赋值给Label的
text属性时,就会显示出多余的0或9,也就是你看到的异常情况。
你可以在Python环境里直接验证这个精度问题:
print(0.1 + 0.1 + 0.1) # 输出不是0.3,而是0.30000000000000004
内容的提问来源于stack exchange,提问作者Scalper Vegeta
相关产品推荐
相关产品推荐

