在检查楼层是否为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
这是正常的吗?
答案 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提供了一些解决浮点问题的方法:decimal
和fractions
。两者都有其自身的缺点,但有时它们会有所帮助。例如,使用fractions
,您可以在不损失精度的情况下表示1/3。同样,使用decimal
,您可以准确地表示0.1。但是,您仍会遇到log
,sqrt
,无理数,需要多位数字表示的数字等问题。