0

これはフォーマットの問題ではありません。

私は少し学習/演習を行っており、Python で「チップ計算機」を作成することにしました。浮動小数点数などを使用して、特定の数値で丸め誤差が発生する可能性があることを十分に認識しています。また、可能な限りペニー/整数のみを処理する必要があることも知っています。

パーセンテージに基づいて合計 (米ドル) を計算する際に、丸めを適切に回避するにはどうすればよいですか?

理想的には、percentageandを取りsubtotal、「チップ」の合計 (パーセンテージに基づく) と新しいチケットの合計を返す関数が必要です。私の電卓で。

現在、私は次のようなものを持っています:

import decimal

def get_tip(percentage, pennies_sub_total):
    """"
    param percentage: I suspect this should be int() or decimal.Decimal. I'm not aware of a condition that would make it matter either way. You? 
    param pennies_sub_total = int()
    """
    percentage = decimal.Decimal(percentage)
    pennies_sub_total = decimal.Decimal(pennies_sub_total)  # Unnecessary use of Decimal?
    tip = (pennies_sub_total * percentage) / 100
    total = (pennies_sub_total + tip)
    return {'tip': tip, 'total': total} 

...うまくいくようですが、厳密にテストする方法がわかりません-コードレビューのためにここに来ました。私は明らかなことを見落としていますか?自信を持てる方法でこれを行いましたか?

アップデート

回答の 1 つ ( https://stackoverflow.com/a/18751401/26196 )で提起された質問を考えると、それが役立つ場合は、それらに対処しようとします。

  1. パーセンテージの種類は何ですか?
  2. pennies_sub_total の型は何ですか? (編集-これはintであると言及しました)
  3. 割り当て後のパーセンテージは、渡されたときと同じ型になりますか。
  4. Decimal、int、float、str として入ってくるものを処理する予定はありますか?
  5. 次に、回答する質問、チップの種類と合計があります。「式」の 100 は int になります。チップの種類は何になりますか?
  6. 指摘したように、12.57 の 15% に対して 1.8855 が必要な結果であるかどうかも判断する必要があります。
  1. intまたはdecimal.Decimal。あの二人に関係あるのかわからない…?
  2. int、しかし、その質問はすでに解決されています。
  3. 多分?返されていません。スコープを台無しにしている場合は、お知らせください。これは、この関数の「スコープ」外の変数を変更することを意図したものではありません。
  4. 1 & 2 を参照してください。
  5. tipdecimal.Decimalおそらく、または「ペニー」の整数として返されるはずです。既存のコード例では、あいまいに float のままにしていたと思います。この特定の行/割り当ては、「実際の」作業が行われる場所であるため、回答を提供するための特定の場所です。
  6. 私の質問は、ペニーよりも小さいものは無視されるべきであることをかなり明確にしていると思いました. 「1.8855」は、「小計 + ヒント」部分を処理する数学が切り上げ/切り捨てを行わず、単純にペニーを合計する限り、良い結果です。私が正しくやっていると確信するために。
4

3 に答える 3

3
>>> import decimal

>>> decimal.Decimal('1.99')
Decimal('1.99')

このモジュールの目的は、おなじみの「校舎」ルールを使用して算術演算をサポートし、バイナリ浮動小数点に関連するトリッキーな表現の問題を回避することです。このパッケージは、金融アプリケーションや、ユーザーが 2 進浮動小数点と矛盾する期待を持っているコンテキストで特に役立ちます (たとえば、2 進浮動小数点では、1.00 % 0.1 は、decimal によって返される予想される Decimal('0.00') の代わりに 0.09999999999999995 を返します)。浮動小数点)。

于 2013-09-11T20:30:54.463 に答える
1

あなたには多くの問題があり、私たちが推測するためにいくつかの問題が残されています.

  1. パーセンテージの種類は何ですか?
  2. pennies_sub_total のタイプは何ですか (編集 - これは int であると言及しました)
  3. 割り当て後のパーセンテージは、渡されたときと同じ型になりますか。
  4. Decimal、int、float、str として入ってくるものを処理する予定はありますか?
  5. 次に、回答する質問、チップの種類と合計があります。「式」の 100 は int になります。チップの種類は何になりますか?
  6. 指摘したように、12.57 の 15% に対して 1.8855 が必要な結果であるかどうかも判断する必要があります。

これらの質問に答えるには、関数とは何かを説明し、Python インタープリターで実行されている結果を表示することをお勧めします。例えば、

>>> tip = (pennies_sub_total * percentage) / 100
>>> tip
于 2013-09-11T21:14:29.407 に答える