@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

EXCELのCEILING関数をVB.NETで

1
投稿者投稿内容
maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 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 ]
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-04-05 19:43
引用:

maruさんの書き込み (2006-04-05 19:26) より:

このように、EXCELのCeilingメソッドを使いたのですが、簡単な方法はありませんか?
VB.NETからVBAの関数をコールするようなやり方はやりたくないので、コードを書いて
実装したいのですがアルゴリズム的にどのようになるか、わかる方いませんか?



これは、EXCEL の Ceiling メソッドを自分でコーディングするというように
読めますが、どのように作ればよいのか?、という意味で良いんでしょうか?

第一引数を第二引数で割って、小数点を切捨て、切り上げした各値で乗じた2つの値
を第一引数との差を求めて、より近い値を返すとか。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-04-05 20:35
どの桁で Ceiling するかの参考になるでしょう。一言で言えば、その精度まで一旦整数部に移せば良いのです。
丸めの単位 (0.5) もその分で割って、元に戻せば良いと思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 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に特化したロジック
で当面我慢しようと思います・・・。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-04-06 11:03
引用:

maruさんの書き込み (2006-04-06 10:30) より:

"その精度まで一旦整数部に移す"という処理をどのようにすればよいか悩んでいるところです。


小数点以下の有効桁数で、System.Math.Pow の係数が変わるだけじゃないですか?
リンク先でもそうやっているので、そこを見て頂きたかったのですが...

精度自体については別途自分で求める必要があります。
System.String にして、小数点以下の桁数を見るのが手軽で良いでしょう。

# 今回は、System.Decimal.* にあるメソッドでやった方が良さそうですね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 2006-04-06 11:40
こんにちは。

またまた言葉足らずでした。

>精度自体については別途自分で求める必要があります。
>System.String にして、小数点以下の桁数を見るのが手軽で良いでしょう。
この部分の処理をどのようにするか悩んでました。
じゃんぬねっとさんのいわれるやり方が手軽そうですが、数学的な解決方法がないか
考えています。

ま、あまり時間かけるのもなんなんで、文字変換での方法でとりあえずはOKとしよう
かなと思います。

ありがとうございました。
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2006-04-06 12:39
>精度自体については別途自分で求める必要があります。
>System.String にして、小数点以下の桁数を見るのが手軽で良いでしょう。
この部分の処理をどのようにするか悩んでました。
じゃんぬねっとさんのいわれるやり方が手軽そうですが、数学的な解決方法がないか
考えています。

1以上になるまで、ループ内で10倍し続ければ、累乗が求められるんじゃないの?
コード:
order = 0; 
while (val >= 1) {
  order++;
  val *= 10;
}

マー帽
常連さん
会議室デビュー日: 2006/01/31
投稿数: 21
投稿日時: 2006-04-06 13:10
引用:

maruさんの書き込み (2006-04-05 19:26) より:
VB.NETの方は指定した数値以上の最小の整数を返します。
Math.Ceiling(12.34) とすると 13 が返ります。

一方、EXCELの方は、指定された基準値の倍数のうち、最も近い値に数値を切り上げます。
Ceiling(12.34,0.5) とすると 12.5 が返ります。

このように、EXCELのCeilingメソッドをVB.NET 2005で再現したいのですが、簡単な
方法はありませんか?


最初のご質問から外れていっている様に感じているのですが
気のせいでしょうか?

最初のご質問の解として、下記の様なコードでは駄目でしょうか?

コード:

Public Shared Function ExcelCeiling(ByVal dValue As Double, ByVal iDigits As Double) As Double

ExcelCeiling = Math.Ceiling(dValue / iDigits) * iDigits

End Function



ちなみに、
引用:

>精度自体については別途自分で求める必要があります。
>System.String にして、小数点以下の桁数を見るのが手軽で良いでしょう。
この部分の処理をどのようにするか悩んでました。


これは"1.0"を小数点の数値で割って逆数を求め、
その整数部の桁数を調べれば良いと思います。

#勘違いしていましたら申し訳ございません。

追記.
引用:

これは"1.0"を小数点の数値で割って逆数を求め、
その整数部の桁数を調べれば良いと思います。


これでは頭の数字までしか分からないですね。
それに逆数でなくても単純に、
Int(Math.Log(小数点の数値, 10))
の結果を正の値にしても同じですね。
ゴミでした。申し訳ございません。

[ メッセージ編集済み 編集者: マー帽 編集日時 2006-04-06 13:41 ]
1

スキルアップ/キャリアアップ(JOB@IT)