今天在学习Python时,用pow函数时,意外发现pow(1000,1/3)的结果居然不是10,而是9.999999999999998。
print(pow(1000, 1/3))
输出结果:
9.999999999999998
后面了解到,pow()是通过内置的方法直接调用,内置方法会把参数作为整型,而math模块则会把参数转换为float。
那么会不会是float化的时候出了问题呢。
我们试着将1/3转化为浮点型:
print(float(1/3))
输出结果:
0.3333333333333333
我们发现这里只有16位小数,与是我试着继续扩大他的小数点位数:
a = 1/3
print('%.20f' % a)
输出结果:
0.33333333333333331483
然后我们可以发现他的值永远不可能是将1平均分成3分,就像是数学里的问题:0.9999999999999999999……=1一样,总会有误差在里面。
我们将得到的数字进行运算。
print(1000**0.3333333333333333)
输出结果:
9.999999999999998
成功破案!这就是为什么pow(1000,1/3)的结果不是10的原因。
那怎么解决呢?
当我们使用pow函数时,最后结果可以用math.ceil()(向上取整)来解决输出结果不准确的问题。
import math
a = pow(1000, 1/3)
print(math.ceil(a))
输出结果:
10
当然我们这里讨论的只是跟为整数时的求根问题,如果跟不是整数时不需要用math.ceil()函数,因使用pow()函数其结果误差极小,可以忽略不计,直接使用。