У меня есть проблема преобразования из типа поплавка в целом:Проблемы с целым типом в питоне
a=0.0003
b=a*10000
c=int(b)
Этот код возвращает мне 2, но мне нужен 3. И b-3.0
возвращает этой
>>> b-3.0
-4.44089209850063 e-16
У меня есть проблема преобразования из типа поплавка в целом:Проблемы с целым типом в питоне
a=0.0003
b=a*10000
c=int(b)
Этот код возвращает мне 2, но мне нужен 3. И b-3.0
возвращает этой
>>> b-3.0
-4.44089209850063 e-16
То, что вы видите, является эффектом представления с плавающей запятой и тем фактом, что int
усекает дробную часть плавающего g номер точки.
Первое приводит к a*10000
, оценивая число немного меньше, чем 3
.
Последнее такое числа имеет значение 2
при преобразовании в int
:
>>> print int(2.999999999999)
2
Вы можете это исправить, округляя результат точечного умножения с плавающим:
b = round(a * 10000)
c = int(b)
Здесь b
имеет Значение 3.0
и int(b)
оценивается в 3
.
In [27]: a = 0.0003
In [29]: a*10000
Out[29]: 2.9999999999999996
In [30]: int(a*10000)
Out[30]: 2
In [31]: b =a*10000
In [32]: b
Out[32]: 2.9999999999999996
In [33]: print b
3.0
In [34]: c = int(b)
In [35]: c
Out[35]: 2
In [37]: b - 3.0
Out[37]: -4.440892098500626e-16
Как вы можете видеть a* 10000
2.999....96
retursns и питон делает 2 об использовании int(b)
. Это ожидаемое поведение. За то, что вы хотите, я хотел бы предложить USInt floor
и ceil
функции в модуле math
:
In [38]: import math
In [41]: math.ceil(b)
Out[41]: 3.0
In [42]: math.floor(b)
Out[42]: 2.0
In [43]: math.floor(b-3.0)
Out[43]: -1.0
In [44]: math.ceil(b-3.0)
Out[44]: -0.0
я думаю, что это лучший способ решить мою проблему, спасибо! –