[イミディエイト ウインドウ]
? (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つ目のルーチンがあれば目茶苦茶に嬉しいです。
「あるよ!」という方は、是非、教えてください。
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
この回答への補足
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かと思います。
正負の判断を加えるならばint関数に収斂するかとも・・・。
ですから、やっぱし方式1かと・・・。
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
? 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つ目の手があろうとは思ってもいませんでした。
回答に心から感謝します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 【 Excel 】映画を見る時間を分割して見るのに、Excel で目安を付けたいのです。 2 2022/10/20 19:16
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- Java Java 配列<選挙> 4 2023/07/31 15:07
- C言語・C++・C# 至急お願いします。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分母 3 2022/07/19 17:09
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【C#/Java?】try-catchでcatch...
-
COBOL OCCURSで指定したデータ...
-
vbaのエラー対応(実行時エラー...
-
IF文に時間(何時から何時ま...
-
特定の名前のオートシェイプの...
-
Excel VBA セルの名前があるか...
-
シグナル 6(SIGABRT)とは?
-
エクセル VBAで複数セル選択時...
-
【VBA】エラー処理で別プロシー...
-
マクロで、次のコードへ行く前...
-
C# 指定時間(秒間)の間処理を...
-
VBA For Each 〜 複数条件について
-
VB6.0で、ランタイムエラーを全...
-
iPhoneのニューラルエンジンっ...
-
StatusStripの表示が更新されな...
-
VB6で定時刻処理
-
private subモジュールを他のモ...
-
複数のファイルに対し同じ処理...
-
特定のファイルを他のプロセス...
-
ListViewから選択中の文字列を取得
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【C#/Java?】try-catchでcatch...
-
private subモジュールを他のモ...
-
IF文に時間(何時から何時ま...
-
マクロで、次のコードへ行く前...
-
特定の名前のオートシェイプの...
-
シグナル 6(SIGABRT)とは?
-
特定のファイルを他のプロセス...
-
ExcelのVBAで、選択したファイ...
-
Excel VBA セルの名前があるか...
-
どう増強すべきか
-
Word VBA。各マクロの間に待ち...
-
【VBA】エラー処理で別プロシー...
-
UWSCのTHREADについて
-
シェルスクリプトでファイル内...
-
ドリブン??
-
Functionで戻り値を複数返す方法
-
iPhoneのニューラルエンジンっ...
-
エクセル VBAで複数セル選択時...
-
COBOL OCCURSで指定したデータ...
-
どうやってもFor文を抜けてしま...
おすすめ情報