浮点数如何比较是否相等¶
表达式 0.1+0.1+0.1 == 0.3 是真还是假?
浮点数不能使用”==”进行精确的是否相等比较,因为其在赋值和算术运算之后,小数点后的位数精读会有 不同。因此不能使用”==”来简单比较,只能使用<=或>=来比较。例如:
>>> print(0.1+0.1+0.1)
0.30000000000000004
>>> 0.1+0.1+0.1 == 0.3
False
三个0.1相加和0.3不相等。这是为什么呢,计算机中所有的数最终都是二进制表示,那0.1如何表示呢? 0/2+0/4+0/8+1/16+1/32+0/64+0/128+1/256, 我们可以用乘二取整的方法,将十进制0.1转换为二进制表示, 但最后0.000110011001100…是一个无线循环的二进制数字。在计算机的内存中会用近似值来保存。 在经过多次运算之后其值会有四舍五入的情况,和我们认为的十进制加法结果不同,因此不能简单使用 ==来判断是否相等。
这个是任何计算机都是这种特性,这是因为其内部最终都是二进制表示,有些10进制 小数无法完全用二进制精确表示导致的。
要比较两个浮点数是否相等,我们可以取其几位进行比较,例如我们取前10位进行比较
>>> round((0.1+0.1+0.1), 10)==round(0.3, 10)
True
其中round函数可以对浮点数返回其给定精读的浮点数,这里我们简单的取其10位小数进行比较。 更深入的精确比较相等的方法请使用数据库decimal(https://docs.python.org/3/library/decimal.html)