python 3.5.x貌似遇到了bug

时间:2022-06-29 17:00:17
python 3.5.x貌似遇到了bug


>>> 0.1 + 0.01
0.11
>>> 0.1 + 0.02
0.12000000000000001
>>> 0.1 + 0.03
0.13
>>> 0.1 + 0.05
0.15000000000000002
>>> 0.1 + 0.06
0.16


这个是bug还是有什么原因造成的?在python 2.6上试了下没有类似错误啊。

6 个解决方案

#1


这个不是bug,浮点数毕竟还是用32位或者64位比特(也有其他位数)表示的,不能表示任意实数,计算机中表示的浮点数实际上是计算机所能表示的浮点数中最接近实际值的那一个。这样就必然会存在一个“量化误差”

#2


浮点数计算是有误差,因为计算机是用位数表示的,不能完整的表达数字的范围,其他编程语言也会有这个问题

#3


python 3.5.x貌似遇到了bug

#4


引用 1 楼 hijack00 的回复:
这个不是bug,浮点数毕竟还是用32位或者64位比特(也有其他位数)表示的,不能表示任意实数,计算机中表示的浮点数实际上是计算机所能表示的浮点数中最接近实际值的那一个。这样就必然会存在一个“量化误差”

好的 多谢指教,我才初学,那么这种性质会对以后实际应用中有影响吗,是不是有什么规范化的方法避免这种误差呢?

#5


引用 2 楼 ligengyong2010 的回复:
浮点数计算是有误差,因为计算机是用位数表示的,不能完整的表达数字的范围,其他编程语言也会有这个问题

好的 多谢指教,我才初学,那么这种性质会对以后实际应用中有影响吗,是不是有什么规范化的方法避免这种误差呢?

#6


引用 4 楼 moshlwx 的回复:
Quote: 引用 1 楼 hijack00 的回复:

这个不是bug,浮点数毕竟还是用32位或者64位比特(也有其他位数)表示的,不能表示任意实数,计算机中表示的浮点数实际上是计算机所能表示的浮点数中最接近实际值的那一个。这样就必然会存在一个“量化误差”

好的 多谢指教,我才初学,那么这种性质会对以后实际应用中有影响吗,是不是有什么规范化的方法避免这种误差呢?


这是系统误差,没办法消除啊。唯一的方法就是用更高的精度来表示啊,比如使用double类型来运算精度肯定会比float类型高。
不过,对于日常应用,float或者double类型也基本上够用了吧?不需要过多关注,除非你有特殊需求。

#1


这个不是bug,浮点数毕竟还是用32位或者64位比特(也有其他位数)表示的,不能表示任意实数,计算机中表示的浮点数实际上是计算机所能表示的浮点数中最接近实际值的那一个。这样就必然会存在一个“量化误差”

#2


浮点数计算是有误差,因为计算机是用位数表示的,不能完整的表达数字的范围,其他编程语言也会有这个问题

#3


python 3.5.x貌似遇到了bug

#4


引用 1 楼 hijack00 的回复:
这个不是bug,浮点数毕竟还是用32位或者64位比特(也有其他位数)表示的,不能表示任意实数,计算机中表示的浮点数实际上是计算机所能表示的浮点数中最接近实际值的那一个。这样就必然会存在一个“量化误差”

好的 多谢指教,我才初学,那么这种性质会对以后实际应用中有影响吗,是不是有什么规范化的方法避免这种误差呢?

#5


引用 2 楼 ligengyong2010 的回复:
浮点数计算是有误差,因为计算机是用位数表示的,不能完整的表达数字的范围,其他编程语言也会有这个问题

好的 多谢指教,我才初学,那么这种性质会对以后实际应用中有影响吗,是不是有什么规范化的方法避免这种误差呢?

#6


引用 4 楼 moshlwx 的回复:
Quote: 引用 1 楼 hijack00 的回复:

这个不是bug,浮点数毕竟还是用32位或者64位比特(也有其他位数)表示的,不能表示任意实数,计算机中表示的浮点数实际上是计算机所能表示的浮点数中最接近实际值的那一个。这样就必然会存在一个“量化误差”

好的 多谢指教,我才初学,那么这种性质会对以后实际应用中有影响吗,是不是有什么规范化的方法避免这种误差呢?


这是系统误差,没办法消除啊。唯一的方法就是用更高的精度来表示啊,比如使用double类型来运算精度肯定会比float类型高。
不过,对于日常应用,float或者double类型也基本上够用了吧?不需要过多关注,除非你有特殊需求。