Visual Basic - 四捨五入
はじめに
VBで四捨五入をするには少し時間がかかります。というのも、「四捨五入の関数」がないためです。Round関数というのもありますが、これはうまく四捨五入してくれません。
ここでは、色々な関数を見ていきながら結局四捨五入はどうすればいいのかを説明していきたいと思います。(四捨五入の方法を見たいだけの方は一番最後を見てください)
Int関数
Int関数は、引数の整数部分を返す関数です。簡単に言うと「切り捨て」です。数学でガウス記号とかいうのが出てきますが、あれです。
Int(2.4) → 2 Int(1.5) → 1 Int(1) → 1 Int(-22.4) → -23 Int(-22.5) → -23
これでわかるように、四捨五入とは違います。
Fix関数
次にFix関数です。これは引数の小数点以下を取った整数を返す関数です。Int関数と見分けがつかないかもしれませんが、実際に見てみればよくわかります。引数がマイナスの値の時に注目してください。
Fix(2.4) → 2 Fix(1.5) → 1 Fix(1) → 1 Fix(-22.4) → -22 Fix(-22.5) → -22
これも四捨五入とは違います。
Format関数
Format関数で、四捨五入を実現することは一応出来ます。なぜ「一応」なのかは、後に説明します。
とりあえず四捨五入の方法です。四捨五入にFormat関数を使うときは、第2引数まで使うだけでできます。第2引数には、"#"や"#.#"、"#.###"などの「#」を使った文字列を指定します。第1引数を、指定した第2引数のフォーマットにした値を返します。
"#.#"というフォーマットにした場合、返される値は「4.3」、「-2.9」など小数点第1位までを表したものになります。この時、フォーマット(第2引数)を"#"にすれば、整数部分だけが返されることになります。しかも、数値は四捨五入された値になります。
Format(2.4 ,"#") → 2 Format(1.5 ,"#") → 2 Format(1 ,"#") → 1 Format(-22.4 ,"#") → -22 Format(-22.5 ,"#") → -23
これで、四捨五入が出来ました…が、Format関数には少し問題があります。
まずは、WindowsXP(SP1未適用)において、動作が違うことです(こちらを参照してください)。よって、WinXPのことを考えると四捨五入にはFormat関数を使わない方が無難です。
次に、動作が遅いことです。まあ、これは上の問題に比べればどうでもいいレベルですが。
Round関数
先ほど書いたように、VBには一応Round関数はあります。しかし、その動作は四捨五入からは少しずれています。それは、引数の小数値が0.5だったとき (2.5や16.5などのとき) 、一番近い偶数を返すということです。
Round(2.4) → 2 Round(1.5) → 2 Round(1) → 1 Round(-22.4) → -22 Round(-22.5) → -22
というわけで、これでも四捨五入は正確に出来ません。
じゃあ結局四捨五入はどうすればいいのか
やっと結論です。結局四捨五入をするには、自分で関数を作るしかありません。一応作っておいたので、参考にしてみてください。
Function Round2(ByVal A as Double) '四捨五入関数 If A = 0 Then Round2 = 0 ElseIf A > 0 Then Round2 = Int(A + 0.5) Else Round2 = -Int(-A + 0.5) End If End Function