Python:如何管理float和int之间的舍入行为?

Python:如何管理float和int之间的舍入行为?,python,floating-point,integer,rounding,Python,Floating Point,Integer,Rounding,在执行以下操作时,避免舍入问题的最佳方法是什么: >>> a =8.92138 >>> a 8.92138 >>> int(a*100000) 892137 十进制给我 >>> Decimal(a) Decimal('8.921379999999999199644662439823150634765625') 如有可能,从开头开始使用小数: >>> a = Decimal('8.92138') &g

在执行以下操作时,避免舍入问题的最佳方法是什么:

>>> a =8.92138 
>>> a
8.92138 
>>> int(a*100000)
892137
十进制给我

>>> Decimal(a)
Decimal('8.921379999999999199644662439823150634765625')

如有可能,从开头开始使用小数:

>>> a = Decimal('8.92138')
>>> int(a * 100000)
892138

循环使用


如有可能,从开头开始使用小数:

>>> a = Decimal('8.92138')
>>> int(a * 100000)
892138

循环使用


int
不舍入——它找到地板(截断小数部分)


int
不舍入——它找到地板(截断小数部分)



我们谈论的不是
str
,而是
float
。如果执行
a=Decimal(8.92138)
操作,仍然会遇到同样的问题。@使用
float
,无法获得准确的值。我更新了代码。@是的,你更新了,这就是为什么你不应该首先使用浮点数的原因。一旦你有了花车,就太晚了。你不能从一个不精确的值中得到一个精确的值。@LarsVegas,我也不是说
str
。)<代码>十进制不是一个包罗万象的答案。您需要知道将要执行的计算<代码>十进制与二进制浮点不一样,当存在除十次幂以外的数字除法时,当存在各种“科学”函数(如正弦或对数等)时。我们谈论的不是
str
,而是
浮点
。如果执行
a=Decimal(8.92138)
操作,仍然会遇到同样的问题。@使用
float
,无法获得准确的值。我更新了代码。@是的,你更新了,这就是为什么你不应该首先使用浮点数的原因。一旦你有了花车,就太晚了。你不能从一个不精确的值中得到一个精确的值。@LarsVegas,我也不是说
str
。)<代码>十进制不是一个包罗万象的答案。您需要知道将要执行的计算
Decimal
不比二进制浮点更精确,当存在除十次幂以外的数字除法时,当存在各种“科学”函数(如正弦或对数等)时。我没有真正的下一票-问题出在哪里?精度问题
int
执行整数楼层操作。它在单位以下失去了所有的精确性。你们并没有真正解释你们认为你们有什么舍入问题。使用浮点运算暗含着“我想对不可精确表示的结果使用近似运算。”直接转换为整数暗含着“我想在整数处使用硬边界进行转换;切掉任何分数部分。”所以你说的是矛盾的事情:使用近似值来接近数学答案,但放弃分数来远离数学答案。要解决这个问题,我们需要知道您真正想要计算什么。例如,为什么要转换为整数?你有一个非常合理的浮点值;为什么要将其转换为整数并丢弃其小数部分?为什么不将其舍入为整数而不是转换为整数(使用截断)?@LarsVegas:Convert from string to float。执行算术运算,例如乘以100000。将浮点数转换为字符串。一点也不涉及整数。我并没有真正的否决票——这个问题有什么问题?精度问题
int
执行整数楼层操作。它在单位以下失去了所有的精确性。你们并没有真正解释你们认为你们有什么舍入问题。使用浮点运算暗含着“我想对不可精确表示的结果使用近似运算。”直接转换为整数暗含着“我想在整数处使用硬边界进行转换;切掉任何分数部分。”所以你说的是矛盾的事情:使用近似值来接近数学答案,但放弃分数来远离数学答案。要解决这个问题,我们需要知道您真正想要计算什么。例如,为什么要转换为整数?你有一个非常合理的浮点值;为什么要将其转换为整数并丢弃其小数部分?为什么不将其舍入为整数而不是转换为整数(使用截断)?@LarsVegas:Convert from string to float。执行算术运算,例如乘以100000。将浮点数转换为字符串。不要涉及整数,这很有用。谢谢,那很有用。谢谢
>>> n = 8.92138
>>> '%.42f' % n   # what n really is
'8.921379999999999199644662439823150634765625'
>>> 100000 * n # result is slightly lower than 892138
892137.9999999999
>>> int(100000 * n) # int takes the floor
892137