4


2

まず最初に、以下の問題を見てください。

https://stackoverflow.com/questions/565797/setroundmodermup-and-rounding-round-values-like-10-results-in-10-0001-how-come[SetRoundMode(rmUp)および10のような丸め値結果は10,0001です。]

通貨の値を切り上げる必要があるため、0.8205は0.83になりますが、上記のSimpleRoundToの動作により頭痛の種になります。

安全な方法で通貨値を切り上げるにはどうすればよいですか?

3 Answer


6


あなたはCeil関数を使うことができます:

newvalue:= Ceil(oldvalue * 100)/ 100;


3


0.8205を0.83に丸め、さらに0.8305を0.84に丸めると、丸めの平均で上向きの偏りが生じます。 デフォルトの丸めモードは、方向性の偏りを避けるために偶数に丸めるバンカー丸めです。

計算に二重入力の性質がある場合、これは特に重要です。 指向性バイアスによる丸めは、両側でミスマッチを引き起こす可能性があります。

`SetRoundMode`を使うとFPUコントロールワードを変更します。 このFPUモードの丸めは浮動小数点演算に適用されることに注意してください。 `Currency`型は固定小数点型(64ビット整数)です。 82.000000000000001のような中間の浮動小数点計算でのわずかな不正確さは、 `Currency`としての値が82.00であると予想される時でさえも切り上げることになります。 スレッドグローバルな丸めモードの変更は、慎重に行う必要があります。


1


あなたはそれを間違ってやっています。

時間やお金などの重要な種類を表すためにフロートを使わないでください。

必要な最高の精度を表す整数を使用してください。 たとえば、1000分の1セントを表す整数を使用します。 それからあなたは周りに82050を渡すことができ、あなたがついに文字列としてそれを表示する必要があるとき*そしてそしてその後にのみ*あなたは整数計算を使用して丸めをしますか。

実際にあなたの質問に答えるために、$ 0.8205を切り上げてはいけません。 0.825ドルになります。