切り上げ・四捨五入を正しく行う
金額計算などで切り捨て・切り上げ・四捨五入を行うことがあると思います。
切り捨てはFix関数を使用すればOKです。
しかし、切り上げ・四捨五入に関してはちょっとした注意が必要だったりします。
- 四捨五入に関しては、Round関数を使用すれば良いような気がしますが、実はこんな問題があったりします。
- 切り上げに関しては結果に0.9を加えてからFix関数で小数部を切り捨てれば良いような感じ(実際、良くありがち)ですが・・・考えてみてください、もし値が1.01だったら0.9を加えても1.91になるだけでFix関数で小数部を切り捨てたら1となって正しい結果になりません。
サンプル(32bit)
Private Function RoundDown(curNum As Currency) As Currency '切り捨て RoundDown = Fix(curNum) End Function Private Function RoundUp(curNum As Currency) As Currency '切り上げ RoundUp = Int(Abs(curNum) * -1) * (Sgn(curNum) * -1) End Function Private Function RoundOff(curNum As Currencye) As Currency '四捨五入 RoundOff = Fix(curNum + (0.5 * Sgn(curNum))) End Function
サンプル解説
まずは簡単な四捨五入から。
- Sgn関数を利用して引数の符号にあわせて0.5を足したり引いたりします。
- FIX関数で小数部を切り捨ててます。
次に切り上げです。
Int関数は負数の場合は切り上げる性質を利用しています。
- Abs関数で絶対値にしてから-1をかけて値を必ず負数にしています。
- 負数にしたらInt関数で切り上げてもらいます。
- あとはSgn関数を利用して元の符号に戻しています。
上記の手順で切り上げを実現しています。
【2007年3月28日追記】引数をCurrency型にしていない場合、精度の問題で結果が希望と異なる場合があったため変更しました。
[ Window Close ]