2

以下のコードでは、浮動小数点数を整数に変換しています。しかし、結果の出力はニッケルに対して正しくありません。

コード:

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

4 に答える 4

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 であるためです。

通常は、精度を維持するためにできるだけ LATE で丸めたいと考えますが、お金を扱っている場合は、完全に int で作業することで、float の悪夢をより早く解消できると思います。

また、2.6 を使用しているため、3.1 まで整数を返さないint()ため、にキャストする必要があります。round()

于 2013-07-24T03:45:21.180 に答える
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。それらは必須です。

于 2013-07-24T03:45:57.420 に答える
1

を行うint(x)と、常に切り捨てられます。つまり、そうすると4 になります。代わりにint(4.9999)使用することを検討してくださいint(round(x))

編集:

待ってください... 100 を掛けたのに、なぜ float を使用しているのですか? 小数は何のために必要ですか?100 を掛けた後、セントを int に変換してから、この float のナンセンスをすべて取り除いてみませんか?

于 2013-07-24T03:22:06.433 に答える