1

値を確認するために print ステートメントを挿入して、変更額を計算する簡単なコードを書いています。

cost = float(raw_input('How much did your meal cost? > '))
payment = float(raw_input('How much did you pay? > '))

change = (payment - cost)

print change

if change < 0:
    print 'You need to pay $%.2f more!' %  (-change)

dollars, q, d, n, p = 0, 0, 0, 0, 0

change = float(change*100)

print change

if change> 100:
    dollars = int(change/100)
    change = change % 100
    print change

if change >= 25:
    q = int(change/25)
    change = change % 25
    print change

if change >= 10:
    d = int(change/10)
    change = change % 10
    print change

if change >= 5:
    n = int(change/5)
    change = change % 5
    print change    

if change >= 1:
    p = int(change/1)
else:
    print "why doesn't this work?"
    print p
    print change

print 'you get %d dollars, %d quarters, %d dimes, %d nickels, and %d pennies!' % (dollars, q, d, n, p)

これは以下を返します:

あなたの食事はいくらかかりましたか。> 34.34

いくら払ったか?> 40

5.66

566.0

66.0

16.0

6.0

1.0

なぜこれが機能しないのですか?

0

1.0

ペニー計算の前後で変動=1.0になっているのがわかりますが、

if change >= 1

まだ false として読み取られ、else ステートメントに進みます。ここで何が起こっていますか?どうすれば修正できますか?

4

4 に答える 4

3

IEEE 754 浮動小数点へようこそ。不正確さを楽しんでください。それらを回避したい場合は、固定小数点または整数メカニズムを使用してください。

于 2013-07-22T03:13:18.223 に答える
1

読んでください:浮動小数点演算:問題と制限

http://docs.python.org/2/tutorial/floatingpoint.html

Decimal Moduleに興味があるかもしれません

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

イグナシオさんのおっしゃる通りです。簡単な修正は、変更を小数点第 2 位に丸める行を挿入することです。関数を使用して物事を少し単純化すると、コードは次のようになります。

def get_change_and_coin(coin_amount, change):
    change = round(change, 2)
    return (change % coin_amount, int(change / coin_amount))


cost = float(raw_input('How much did your meal cost? > '))
payment = float(raw_input('How much did you pay? > '))

change = (payment - cost)

print change

if change < 0:
    print 'You need to pay $%.2f more!' %  (-change)

dollars, q, d, n, p = 0, 0, 0, 0, 0

dollars = int(change)
change = float(change*100)

(change, q) = get_change_and_coin(25, change)
(change, d) = get_change_and_coin(10, change)
(change, n) = get_change_and_coin(5, change)
(change, p) = get_change_and_coin(1, change)

print 'you get %d dollars, %d quarters, %d dimes, %d nickels, and %d pennies!' % (dollars, q, d, n, p)

お役に立てれば!

于 2013-07-22T03:25:09.627 に答える
0

float(40)-float(34.34)=5.659999999999997

「change = 1.0」は 1.0 ではなく、0.99999999999 だとおっしゃっていると思います。

試す:round(40-34.34, 2)

于 2013-07-22T03:19:41.597 に答える