对pow函数的思考

今天在学习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()函数其结果误差极小,可以忽略不计,直接使用。

posted @ 2020-03-05 13:24  再不学习就玩儿完了  阅读(350)  评论(0编辑  收藏  举报