int()转换python中的float

时间:2013-07-24 03:18:58

标签: python python-2.6

我在下面的代码中将float转换为整数。但是,结果输出对于镍币来说是不正确的。

代码:

actual = 25
paid = 26.65
cents = (paid-actual)*100
quarters = int(cents/25)
cents = cents %25
dimes = int(cents/10)
cents = cents %10
nickels = int(cents/5)
print quarters, dimes, nickels,cents
print 5.0/5,int(5.0/5)

输出继电器:

6 1 0 5.0
1.0 1

预期输出

6 1 1 5.0
1.0 1

如果我显式地执行int(5.0 / 5),我得到1,但是当我的代码中的变量分配给同一个变量时,我得到0。我不知道为什么。有人可以解释一下吗?

4 个答案:

答案 0 :(得分:6)

浮点数不能保证在您期望的数字上,它们可能只是勉强关闭,说5.0可能实际上是4.999...并且int()截断/舍入,你得到错误。

许多银行只是完全放弃浮点问题而只需要1.00美元= 100 我会建议你这样做,就像这样:

actual = 25
paid = 26.65
cents = int(round(paid*100)) #Turns 26.65 into 2665 before you do any float math
dollars = cents / 100
cents %= 100
quarters = cents / 25
cents %= 25
dimes = cents / 10
cents %= 10
nickels = cents / 5
print quarters, dimes, nickels,cents
print 5.0/5,int(5.0/5)

注意这会输出2 1 1 5,因为这是2个季度,1个角钱,1个镍= $ .65

通常你想要尽可能地缩小以保持精确度,但是当你使用金钱时,我认为完全使用整数可以让浮动的噩梦更快消失。

此外,由于您使用的是2.6,因此需要转换为int(),因为round()在3.1之前不会返回整数

答案 1 :(得分:3)

Floating point numbers cannot represent all real numbers

每次使用浮点数进行任何操作时,您都可以通过浮点表示所代表的最接近的结果来近似精确结果。当你写

26.65

Python实际上使用

26.64999999999999857891452847979962825775146484375

使用浮点数进行数学运算时,结果将四舍五入到最接近的可表示数字。  print将浮点数截断为12位小数,因此小的不准确性不可见,但在计算时

int(cents/5)

cents实际为4.999999999999858cents/50.9999999999999716,向下舍入为0

答案 2 :(得分:2)

其他用户已经解释了浮点是如何不精确的。在您的情况下,请考虑使用Decimal进行更精确的计算:

>>> from decimal import Decimal
>>> actual = Decimal('25')
>>> paid = Decimal('26.65')
>>> actual,paid
(Decimal('25'), Decimal('26.65'))
>>> cents = (paid-actual)*100
>>> cents
Decimal('165.00')
>>> quarters = int(cents/25)
>>> cents = cents % 25
>>> dimes = int(cents/10)
>>> cents = cents %10
>>> nickels = int(cents/5)
>>> print quarters, dimes, nickels,cents
6 1 1 5.00
>>> cents
Decimal('5.00')

记下创建原始actualpaid的数字的字符串。他们是必需的。

答案 3 :(得分:1)

当你执行int(x)时,它总是向下舍入,这意味着如果你做int(4.9999),你将得到4.考虑使用int(round(x))而不是

修改

等等......如果你乘以100,你为什么还要使用花车呢?你需要什么小数?为什么不在你乘以100之后将美分变成一个int然后摆脱所有这些浮动的废话呢?