我在下面的代码中将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。我不知道为什么。有人可以解释一下吗?
答案 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.999999999999858
,cents/5
为0.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')
记下创建原始actual
和paid
的数字的字符串。他们是必需的。
答案 3 :(得分:1)
当你执行int(x)
时,它总是向下舍入,这意味着如果你做int(4.9999)
,你将得到4.考虑使用int(round(x))
而不是
修改强>
等等......如果你乘以100,你为什么还要使用花车呢?你需要什么小数?为什么不在你乘以100之后将美分变成一个int然后摆脱所有这些浮动的废话呢?