- - PR -
EXCELのCEILING関数をVB.NETで
1
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-04-05 19:26
こんにちは。お世話になってます。
EXCELの組み込み関数にCEILING関数があります。 VB.NETにもMathクラスにCEILINGメソッドがありますが、若干挙動が違います。 VB.NETの方は指定した数値以上の最小の整数を返します。 Math.Ceiling(12.34) とすると 13 が返ります。 一方、EXCELの方は、指定された基準値の倍数のうち、最も近い値に数値を切り上げます。 Ceiling(12.34,0.5) とすると 12.5 が返ります。 このように、EXCELのCeilingメソッドをVB.NET 2005で再現したいのですが、簡単な 方法はありませんか? VB.NETからVBAの関数をコールするようなやり方はやりたくないので、コードを書いて 実装したいのですがアルゴリズム的にどのようになるか、わかる方いませんか? ※言葉足らずでした。すいません。編集しました。(T_T;) [ メッセージ編集済み 編集者: maru 編集日時 2006-04-05 19:45 ] | ||||||||||||||||
|
投稿日時: 2006-04-05 19:43
これは、EXCEL の Ceiling メソッドを自分でコーディングするというように 読めますが、どのように作ればよいのか?、という意味で良いんでしょうか? 第一引数を第二引数で割って、小数点を切捨て、切り上げした各値で乗じた2つの値 を第一引数との差を求めて、より近い値を返すとか。 | ||||||||||||||||
|
投稿日時: 2006-04-05 20:35
どの桁で Ceiling するかの参考になるでしょう。一言で言えば、その精度まで一旦整数部に移せば良いのです。
丸めの単位 (0.5) もその分で割って、元に戻せば良いと思います。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||
|
投稿日時: 2006-04-06 10:30
こんにちは。
返答ありがとうございます。まるめ単位の整数値で割って、またかけて元に戻すという のはすぐに思いついたのですが、 0.5 → 0.5 * 10 → 5 0.02 → 0.02 * 100 → 2 0.025 → 0.025 * 1000 → 25 というように"その精度まで一旦整数部に移す"という処理をどのようにすればよいか 悩んでいるところです。 人間の頭で考えれば、 0.5 = 5 * LOG10(0.1) = 5 * 10^-1 とわかるので、 0.5 * 10 ^ 1 をすれば 5 に なるとわかりますが、それがアルゴリズム的にどのようにすればいいか、(どのよう な関数を使えばいいか)がわかりません。 数学は苦手なもので・・・ ![]() 今回は、丸め単位が 0.5 固定なので、汎用的な関数ではなく 0.5に特化したロジック で当面我慢しようと思います・・・。 | ||||||||||||||||
|
投稿日時: 2006-04-06 11:03
小数点以下の有効桁数で、System.Math.Pow の係数が変わるだけじゃないですか? リンク先でもそうやっているので、そこを見て頂きたかったのですが... 精度自体については別途自分で求める必要があります。 System.String にして、小数点以下の桁数を見るのが手軽で良いでしょう。 # 今回は、System.Decimal.* にあるメソッドでやった方が良さそうですね。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||
|
投稿日時: 2006-04-06 11:40
こんにちは。
またまた言葉足らずでした。 >精度自体については別途自分で求める必要があります。 >System.String にして、小数点以下の桁数を見るのが手軽で良いでしょう。 この部分の処理をどのようにするか悩んでました。 じゃんぬねっとさんのいわれるやり方が手軽そうですが、数学的な解決方法がないか 考えています。 ま、あまり時間かけるのもなんなんで、文字変換での方法でとりあえずはOKとしよう かなと思います。 ありがとうございました。 | ||||||||||||||||
|
投稿日時: 2006-04-06 12:39
>精度自体については別途自分で求める必要があります。
>System.String にして、小数点以下の桁数を見るのが手軽で良いでしょう。 この部分の処理をどのようにするか悩んでました。 じゃんぬねっとさんのいわれるやり方が手軽そうですが、数学的な解決方法がないか 考えています。 1以上になるまで、ループ内で10倍し続ければ、累乗が求められるんじゃないの?
| ||||||||||||||||
|
投稿日時: 2006-04-06 13:10
最初のご質問から外れていっている様に感じているのですが 気のせいでしょうか? 最初のご質問の解として、下記の様なコードでは駄目でしょうか?
ちなみに、
これは"1.0"を小数点の数値で割って逆数を求め、 その整数部の桁数を調べれば良いと思います。 #勘違いしていましたら申し訳ございません。 追記.
これでは頭の数字までしか分からないですね。 それに逆数でなくても単純に、 Int(Math.Log(小数点の数値, 10)) の結果を正の値にしても同じですね。 ゴミでした。申し訳ございません。 [ メッセージ編集済み 編集者: マー帽 編集日時 2006-04-06 13:41 ] |
1