python中浮点的int()转换

python中浮点的int()转换,python,python-2.6,Python,Python 2.6,我在下面的代码中将浮点转换为整数。但是,结果输出对于镍币是不正确的 代码: 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.

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

代码:

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
输出:

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。我不知道为什么。有人能解释一下吗?

当你做
int(x)
时,它总是四舍五入,这意味着如果你做
int(4.9999)
你会得到4。考虑使用<代码> int(圆(x))< /> >代替

编辑:

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
等等……如果你乘以100,为什么还要用浮点数呢?你需要小数做什么?为什么不在乘以100后把美分变成整数,然后去掉所有这些无意义的浮点数呢?

每次使用浮点数进行任何操作时,都是用最接近的浮点数表示法来近似精确的结果。当你写作时

26.65
Python实际上使用

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

int(cents/5)

cents
实际上是
4.9999999999858
cents/5
0.9999999716
,这四舍五入到
0

浮点数不一定是你所期望的数字,它们可能只差一点点,假设
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)
注意这会输出215,因为这是2个四分之一,1个一角硬币和1个镍币=.65美元

通常,您希望尽可能晚地取整以保持精度,但当您使用货币时,我认为完全使用ints会使浮动的噩梦更快地消失


另外,由于您使用的是2.6,因此需要强制转换为
int()
,因为
round()
在3.1之前不会返回整数,其他用户解释了浮点是如何不精确的。在你的情况下,考虑使用更精确的计算:

>>> 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')

记下创建原始<代码>实际<代码>和<代码>已付<代码>的数字字符串。它们是必需的。

int(舍入(x))
会在不应该舍入的情况下舍入,使用过多的硬币。这里的问题是他的浮点数不准确。每次设置时,不要在类型转换内部舍入美分,而是舍入美分。因此它变成了
cents=round(cents%25)
。我昨天刚刚处理了一个类似的问题,可能会对你有所帮助()四舍五入给出的输出是
711
,而它应该是
611
啊,你是对的。等等……如果你乘以100,为什么还要用浮点数呢?你需要小数做什么?为什么不在乘以100后把美分变成整数,然后去掉所有这些浮点数的废话呢?(如果你看看我发布的另一个问题,我很确定我们最终就是这么做的)我们如何验证美分的价值?当我把它打印出来时,它显示了5。0@misguided:
打印报告(美分)
。就我个人而言,我觉得默认的12位显示精度是一个错误。如果人们想要12位数字,他们可以通过字符串格式得到。我甚至可以避免26.65,直接选择2500和2665。@LennartRegebro不想改变他的输入,但我会做类似的事情