5

私は 4 ユーロの製品を持っており、このお金を 3 つの部門に分割する必要があります。2 番目の列では、この製品の行数を取得し、部門数で割る必要があります。

私のクエリ:

select
   department, totalvalue,
   (totalvalue / (select count(*) from departments d2 where d2.department = p.product))
       dividedvalue
from products p, departments d
where d.department = p.department

Department  Total Value  Divided Value
----------  -----------  -------------
A           4            1.3333333
B           4            1.3333333
C           4            1.3333333

しかし、値を合計すると、3,999999 になります。もちろん、何百もの行があると大きな違いが生じます... 2 つの 10 進数を定義して最後の値を四捨五入する機会はありますか? (私の結果は 1.33 1.33 1.34 になります)つまり、最後の行を調整する方法はありますか?

4

5 に答える 5

1

これを処理するには、行ごとに次の操作を行う必要があります。

  • 分割を実行します
  • 結果を適切なセント数に丸める
  • 丸められた金額と除算の結果との差を合計します
  • 差の合計が小数第 1 位以下 (この場合は 0.01) を超えた場合は、その分を次の除算の結果 (四捨五入後) に加算します。

これにより、端数が行全体に均等に分配されます。残念ながら、単純なクエリを使用して SQL でこれを行う簡単な方法はありません。おそらく手続き型コードでこれを実行する方がよいでしょう。

それがどれほど重要かというと、金融アプリケーションや機関に関して言えば、このようなことは非常に重要です。たとえそれが 1 セント単位であっても、X レコードごとにしか発生しないとしてもです。通常、ユーザーは値がペニー (または通貨単位) に正確に関連付けられることを望んでいます。

最も重要なことは、 「スーパーマン III」「オフィス スペース」のようなエクスプロイトの発生を許可したくないということです。

于 2011-01-24T18:34:06.817 に答える
0

また、特定の値の丸め差を次の丸められる数値に (丸めの前に) 追加するだけで簡単に実行できます。このようにして、パイルは常に同じサイズのままです。

于 2015-01-29T08:28:46.623 に答える
0

おそらく、Total - sum(A,B,C) となる 4 行目を作成できます。しかし、それはあなたが何をしたいかによって異なります。正確な値が必要な場合は、分数を保持できます。それ以外の場合は、切り捨てて仮想損失を気にしません

于 2011-01-24T17:19:11.270 に答える
0

小数点以下 6 桁の精度では、最終的な数値を小数点以下 2 桁に四捨五入すると、1 セントの違いに気付くのに約 5,000 回のトランザクションが必要になります。小数点以下の桁数を許容レベルまで増やすと、ほとんどの問題が解消されます。たとえば、小数点以下 9 桁を使用すると、1 セントの違いに気付くには約 5,000,000 回のトランザクションが必要になります。

于 2011-01-24T17:23:27.053 に答える