- PR -

四捨五入について

投稿者投稿内容
なび
ぬし
会議室デビュー日: 2007/08/27
投稿数: 273
投稿日時: 2008-06-15 20:32
 こんばんは。
初歩的な質問ですいません。

VB2005の四捨五入について教えてください。

ある数値の変数の値を円から万単位にするため
10000で割りますが(四捨五入です)

Fix(変数/10000+ 0.5 * System.Match.Sign(変数))
としましたが

Fix(変数/10000+ 0.5 * System.Match.Sign(変数/10000))が
正しいのでしょうか?

それともう1点お聞きしたいのが
率の四捨五入の方法です。

四捨五入は小数点以下2桁目を四捨五入したいのです。
この場合
Fix(変数A/変数B+ 0.5 * System.Match.Sign(変数A/変数B))
ではなく
正しくはどのようにするのでしょうか?

申し訳ありません、ご教授宜しくお願いします。


Azulean
大ベテラン
会議室デビュー日: 2008/01/04
投稿数: 123
お住まい・勤務地: 大阪府
投稿日時: 2008-06-15 20:58
四捨五入のメソッドが存在しますので、こちらを軸に考えてはいかがでしょうか?
http://msdn.microsoft.com/ja-jp/library/ef48waz8(VS.80).aspx

10000で割る、Roundで四捨五入、10000をかける。

追記
小数点以下2桁目とかは引数の多いRoundメソッドで。
http://msdn.microsoft.com/ja-jp/library/system.math.round(VS.80).aspx

追記2
提示すべきメソッドのオーバーロードが間違っていましたので訂正します。
編集前は http://msdn.microsoft.com/ja-jp/library/75ks3aby(VS.80).aspx を書いていましたが、このメソッドでは期待した結果が得られません。

追記3
引数が1つのオーバーロードも誤りです。
編集前は http://msdn.microsoft.com/ja-jp/library/wyk4d9cy(VS.80).aspx を書いていましたが、このメソッドでは期待した結果が得られません。


[ メッセージ編集済み 編集者: Azulean 編集日時 2008-06-16 07:26 ]

[ メッセージ編集済み 編集者: Azulean 編集日時 2008-06-16 22:45 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-06-16 00:52
それだと 「四捨五入」 ではなく 「偶数丸め」 なので、MidpointRounding 引数のあるオーバーロードが正しいです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Azulean
大ベテラン
会議室デビュー日: 2008/01/04
投稿数: 123
お住まい・勤務地: 大阪府
投稿日時: 2008-06-16 07:24
失礼しました。
オーバーロード版の機能の差を認識していませんでした。

じゃんぬねっとさんのご指摘通り、引数が1つか、MidpointRounding引数のあるオーバーロードを使う必要があるようです。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-06-16 09:27
引用:

Azuleanさんの書き込み (2008-06-16 07:24) より:

じゃんぬねっとさんのご指摘通り、引数が1つか、MidpointRounding引数のあるオーバーロードを使う必要があるようです。


? 引数が 1 つのオーバーロードも偶数丸めですよね。(ただの書き間違いかも?)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-06-16 09:56
既に回答がついているので、以下のお話は完全に蛇足です。

引用:

なびさんの書き込み (2008-06-15 20:32) より:

ある数値の変数の値を円から万単位にするため
10000で割りますが(四捨五入です)

Fix(変数/10000+ 0.5 * System.Match.Sign(変数))
としましたが

Fix(変数/10000+ 0.5 * System.Match.Sign(変数/10000))が
正しいのでしょうか?


この2つはどちらも同じ結果になりますよね。
10000で割ろうが割るまいが、変数の符号は変わらないので。

ちなみにVB2003以前だと Roundメソッドで端数処理の方法を指定できず常に偶数丸めだったので、いわゆる四捨五入をやりたい時にはこんな風に書いていました。
コード:
Math.Floor(x + 0.5)



小数第二位で四捨五入したい場合はこんな感じですか。
コード:
Math.Floor(x * 10 + 0.5) / 10


FIX() は単純に端数を捨てるだけですが、Floor() はその値をこえない最大の整数を返すので、負数の四捨五入を考えるのであればこちらのほうが楽でしょう。

※しつこいですがこれはVB2003までのお話で、VB2005以降なら Round() のオーバーロードを使ったほうが簡単です。
なび
ぬし
会議室デビュー日: 2007/08/27
投稿数: 273
投稿日時: 2008-06-16 10:11
みなさんありがとうございます。

おかげ様で
Math.Round(55 / 99 * 100, 1, MidpointRounding.AwayFromZero)
で、できました。

1つ勉強になりました。
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-06-16 12:19
某所でご指摘を受けましたが、先の私の書き込みについて1点注意をお願いします。

コード:
Fix(d + 0.5 * System.Match.Sign(d))
Math.Round(d , MidpointRounding.AwayFromZero)


コード:
 
Math.Floor(d + 0.5)



なびさんが書いた上の2つの方法と、私が書いた下の方法とでは、負数を丸めた結果が異なります。
-2.5 を計算した場合、なびさんが書いた方法では -3 になりますが、私の書いた方法では -2 になります。
小数第1位が4以下ならば切り捨て、5 以上ならば切り上げる四捨五入の場合、なびさんが書いた方法が正しいです。

誤った方法を書いたことをお詫びいたします。

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