2

これがシナリオです。

割引を適用するためのコードを書いていますが、さまざまな問題が発生しています。

私の注文には次のものがあると仮定し、営業担当者として、この注文に対して23.47ポンドの割引を顧客に提供することにしました。

私は3つの広告申込情報を持っており、そのうち2つは150.00ポンド、1つは10.00ポンドです。注文の総額は£310.00です

したがって、各ラインアイテムの%discountを計算する必要があります(外部インターフェイスは注文レベルの割引に対応できず、ラインアイテムの割引のみに対応できるため)。また、外部インターフェイスは、Discount%フィールドの小数点以下1桁のみを処理できます。

論理:

  1. 注文の合計(割引前)を計算します。それは£310.00になります。
  2. 割引額を注文総額のパーセンテージとして計算します。つまり、£23.47/£310.00です。

割引率は7.570967741935484%になります。ただし、これは7.6%に四捨五入する必要があります。そうすると、各広告申込情報の割引額が高くなります。各ラインアイテムの割引額は高くなります。そして、私が最終的に与える割引の合計は23.56ポンドで、これは私が意図したものである23.47ポンドよりも0.08ポンド多くなっています。

各ラインアイテムは£11.36、£11.36、£0.76の割引を受けるはずですが、私は£11.40、£11.40、£0.76を与えることになります。

必要なのは、各ラインアイテムの四捨五入で発生する「エラー」を計算し、適用可能な最低価格のアイテムのエラーを補正して、割引価格が何に近くなるかを確認することです。私は与えるつもりでした(しかし、それは切り上げられるべきであり、決して切り下げられるべきではありません)。

各ラインアイテムに割引を適用する場合、適用する必要のある残りの割引額を「覚えておく」必要がありますか?

次のような擬似コード。

iterating through each line item
//first line item where I have given more discount than intended. 4p more. So, the remaining discount is not £12.11 but actually £12.07
//Calculate the discount% for remaining line items, i.e., 
//And, I am confused :-)

これを行うための最良の方法は何でしょうか?

PS:これがここにある必要があるかどうかはわかりません。ただし、SEサイトに該当しない場合は、私を正しい方向に向けるか、削除してください。

4

3 に答える 3

0

7.6%に丸めないでください。7.570967741935484%全体を使用して、各アイテムの正確な(ish)割引を計算してください。

これにより、小数の結果が得られます。必要に応じて切り上げますが、どちらの方法でも小数のエラーを解決します。

次のアイテムで、丸める方法を決定する前に、前のアイテムのエラーを追加します。

繰り返す。

于 2012-04-16T15:42:28.113 に答える
0

申し訳ありませんが、割引率が小数点以下 1 桁以内に制限されている場合は、必ずしも達成できるとは限りません。

次の入力を想像してみてください。1000 ポンドの商品を 1 つだけ販売していて、1 ペンスの値引きをしたいとします。したがって、0.1% の割引 (結果として全体で 1 ポンド) または 0% (結果としてまったく割引されない) のいずれかになります。

実際、あなたが提供できる割引は、最小の商品価格の 1/1000 (1 から 1000 まで) で表すことができ、2 番目に小さい商品価格などから割引を追加することもできます。

そのため、本当に必要な割引額が得られない場合があります。この場合はどうすればよいでしょうか?

簡単な方法は、さまざまな割引を組み合わせて試すことです。明らかに、各アイテムを P (通常価格)、999/1000 * P、998/1000 * P、... 0/1000 * P で販売できます。したがって、各アイテムの係数を見つけることができます。合計金額を必要な金額にできるだけ近づけます。残念ながら、この単純なアイデアは、購入するアイテムの数が多い場合は遅すぎます.

(余談: 正の割引のみに制約されていない場合、実際には次のトリックを実行できます: すべての商品価格の最大公約数を見つけ、それがあれば、GCD の精度で任意の価格を簡単に作成できます。 /1000.)

負の割引についての注意: 負の割引も許可されていると想像してください。たとえば、-1% の割引を与えると、顧客は商品に対して 1% 余分に支払うことなります。このようにして、より正確な近似を実現できます。例: それぞれ 1000 ポンドと 990 ポンドの 2 つのアイテムがあり、合計で 1 ペンスの割引を適用したい場合: 最初のアイテムに 0.1% の割引を適用し、最初のアイテムに -0.1% の割引を適用することで、これを実現できます。 2 番目のアイテムなので、顧客は最初のアイテムに £1000 * 99.9% = £999、2 番目のアイテムに £990 * 100.1% = £990.99 を支払います。全体で £1989.99 で、これは £1990 からちょうど 1 ペンスの割引です。正の割引だけでは、このような精度を達成することはできませんね。

于 2012-04-16T15:42:55.217 に答える