このフォーラムの他の場所で見つけたこの便利なコードを使用して、スプレッドシートでVBA Round()関数を使用しようとしています。
Function BankerRound(rng As Double, sig As Integer) As Double
BankerRound = Round(rng, sig)
End Function
しかし、私はこれらの結果に驚いています(すべて小数点以下2桁を使用しています)
1233.71537501667 rounds to 1233.72
1233.715 rounds to 1233.71
結果が異なる理由を誰かが説明できますか?
丸めアルゴリズムは、「中間」の場合の処理方法が異なります。詳細については、ウィキペディアのディスカッションを参照してください。
いわゆるBankers Rounding
(銀行家が使用しているとは思わない)に関しては、アルゴリズムは最も近い偶数に丸めることを要求します。
したがって、1233.715の特定の例は1233.72に丸められるはずです。これは、123.715が123.72に丸められるのとほぼ同じ方法です。
そうでない理由は、おそらくMSVBAがIEEE仕様に正確に準拠して表現できない10進値を処理する方法にあると思います。ほとんどの場合、内部に格納されている値の10進表現は次のようなものです。1233.71499999...
これが重要な場合は、浮動小数点バイナリではなく整数として格納されるDecimalデータ型を使用して目的の値を取得できるはずです。
例えば:
Function bankerRound(num As Variant, numDecimals As Long)
bankerRound = Round(CDec(num), numDecimals)
End Function
さらに明確にするために(?混乱?)、以下の結果を調べてください。
vbaRound
関数は、ダブルデータ型を使用しています
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加