プロが教えるわが家の防犯対策術!

[イミディエイト ウインドウ]
? (int(0.001)<>0.001) * -1
1
? int(0.001 * -1) * -1
1.0

RoundUp関数について考えてみました。
色々と考えましたが、上記の2つしかないというのが私の結論。
「System.Math.Roundを援用しなければ」ですが・・・。

? RoundUp(0.1)
1
? RoundUp(0.01)
1
? RoundUp(0.001)
1

桁位置の引数を持たないもっともシンプルなRoundUp関数がテーマです。
正と負の値の問題は、一応、横に置きます。

仮に、3つ目のルーチンがあれば目茶苦茶に嬉しいです。
「あるよ!」という方は、是非、教えてください。

A 回答 (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

この回答への補足

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

片田舎の素人ですので宜しくお願いします。

補足日時:2009/02/06 18:16
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

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

お礼日時:2009/02/06 15:56

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

この回答への補足

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

補足日時:2009/02/06 17:13
    • good
    • 0
この回答へのお礼

? 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つ目の手があろうとは思ってもいませんでした。

回答に心から感謝します。

お礼日時:2009/02/06 17:11

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!