来自地板的Python is_integer的奇怪行为

时间:2016-02-01 19:52:29

标签: python math logging floor

在检查楼层是否为int时,建议的方法是is_integer

但是,我对log函数的结果有一个奇怪的行为:

print(log(9,3));                        #2.0
print((log(9,3)).is_integer());         #True

print((log(243,3)));                    #5.0
print((log(243,3)).is_integer());       #False

此外:

print((int) (log(9,3)));    #2
print((int) (log(243,3)));  #4

这是正常的吗?

2 个答案:

答案 0 :(得分:4)

log(243,3)根本没有给你5:

>>> '%.60f' % log(243,3)
'4.999999999999999111821580299874767661094665527343750000000000'

正如the docs所说,log(x, base) “计算为log(x)/ log(base)”。并且log(243)log(3)都不能完全表示,并且您会得到舍入错误。有时你很幸运,有时候你不幸。不要指望它。

答案 1 :(得分:3)

如果要比较浮点数,请使用math.isclose()

如果要转换接近整数的浮点数,请使用round()

对于要使用的“常规”方法,浮点数太容易出错。遗憾的是,它们的精度(以及log等函数的精度)太有限了。什么看起来像5可能不是一个确切的5。

是的:这是正常的。这不是Python的问题,而是我所知道的每种语言(它们都使用相同的底层表示)。 Python提供了一些解决浮点问题的方法:decimalfractions。两者都有其自身的缺点,但有时它们会有所帮助。例如,使用fractions,您可以在不损失精度的情况下表示1/3。同样,使用decimal,您可以准确地表示0.1。但是,您仍会遇到logsqrt,无理数,需要多位数字表示的数字等问题。