• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VB2008: 切り上げ処理ルーチンの3つ目は?)

VB2008: 3つ目の切り上げ処理ルーチンは?

このQ&Aのポイント
  • VB2008での切り上げ処理について考えています。
  • 現在のところ、System.Math.Roundを使用するか、int関数を組み合わせる方法しか見つけていません。
  • もっとシンプルな切り上げ処理ルーチンがあれば便利です。

質問者が選んだベストアンサー

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.1

「小数点以下を切り捨てても元と同じ(=整数)ならそのまま、  異なる(=小数を持つ)なら切り上げ」 と考え方で、以下のような関数では問題がありますか? 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

noname#140971
質問者

お礼

回答ありがとうございます。 ルーチン的には方式1かと思います。 正負の判断を加えるならばint関数に収斂するかとも・・・。 ですから、やっぱし方式1かと・・・。

noname#140971
質問者

補足

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の方法として以上のやり方を考えています。 このルーチンの信頼性ってどの程度でしょうか? 片田舎の素人ですので宜しくお願いします。

その他の回答 (1)

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.2

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

noname#140971
質問者

お礼

? 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つ目の手があろうとは思ってもいませんでした。 回答に心から感謝します。

noname#140971
質問者

補足

N2を利用すればもっとスマートになるみたいですね。