- ベストアンサー
VB2008: 3つ目の切り上げ処理ルーチンは?
- VB2008での切り上げ処理について考えています。
- 現在のところ、System.Math.Roundを使用するか、int関数を組み合わせる方法しか見つけていません。
- もっとシンプルな切り上げ処理ルーチンがあれば便利です。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
「小数点以下を切り捨てても元と同じ(=整数)ならそのまま、 異なる(=小数を持つ)なら切り上げ」 と考え方で、以下のような関数では問題がありますか? Function RoundUp(lng As Double) As Long On Error GoTo エラー処理 Dim Rsl As Long '負の場合の切り上げ方向次第で、Fix関数はInt関数に差し替え '(その指定自体をOptionalの引数にし、If文で切り分けてもいいかもしれません) Rsl = lng - (lng > Fix(lng)) 終了処理: RoundUp = Rsl: Exit Function エラー処理: MsgBox Err & ":" & Error$, , "RoundUp(関数)" Resume 終了処理 End Function
その他の回答 (1)
- DexMachina
- ベストアンサー率73% (1287/1744)
No.1です。 すみません、提示された式の意味を読み取りきれていませんでした(汗) 代案として、「型を宣言した変数への代入を行い、その型に合わない 場合に値が丸められる」ことを利用した以下の関数を提示します: Public Function RoundUp(x As Double) As Long On Error GoTo エラー処理 Dim Rsl As Long, Tmp As Long '「長整数型の変数への代入前後で値が同じなら整数、 '異なるなら小数を持つ」として判断 Tmp = x Rsl = x - (Tmp <> x) 終了処理: RoundUp = Rsl Exit Function エラー処理: MsgBox Err & ":" & Error$, , "RoundUp(関数)" Resume 終了処理 End Function
お礼
? RoundUp2(0.001) 1.0 ? RoundUp2(0.001, 2) 0.01 ? RoundUp2(-0001) -1.0 ? RoundUp2(1111, -2) 1200.0 Function RoundUp2(ByVal M As Double, Optional ByVal D As Integer = 0) As Double Dim N1 As Double = System.Math.Abs(M * 10 ^ D) Dim N2 As Long = System.Math.Abs(M * 10 ^ D) Return System.Math.Sign(M) * Int(N1 - (N1 <> N2)) / 10 ^ D End Function 完璧に動作しています。 3つ目の手があろうとは思ってもいませんでした。 回答に心から感謝します。
補足
N2を利用すればもっとスマートになるみたいですね。
お礼
回答ありがとうございます。 ルーチン的には方式1かと思います。 正負の判断を加えるならばint関数に収斂するかとも・・・。 ですから、やっぱし方式1かと・・・。
補足
Function RoundUp3(ByVal M As Double, Optional ByVal D As Integer = 0) As Double Return System.Math.Sign(M) * Int(System.Math.Abs(M) * 10 ^ D + 1.0R / 3.0R * 3.0R) / 10 ^ D End Function 昨晩より第4の方法として以上のやり方を考えています。 このルーチンの信頼性ってどの程度でしょうか? 片田舎の素人ですので宜しくお願いします。