- PR -

四捨五入

投稿者投稿内容
damepg
大ベテラン
会議室デビュー日: 2003/03/19
投稿数: 229
お住まい・勤務地: 東京都内
投稿日時: 2003-07-28 18:02
VB.NETでWeb開発をしています。
下記の様な整数値を1万の位で四捨五入したいのですが、VB.NETのクラスライブラリで
なにか良い関数はありませんか?

Dim aa as Integer = 2367896

一万の位「6」を四捨五入して「2400000」にしたい!

よきアドバイスをお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-07-28 18:32
引用:

damepgさんの書き込み (2003-07-28 18:02) より:
VB.NETでWeb開発をしています。
下記の様な整数値を1万の位で四捨五入したいのですが、VB.NETのクラスライブラリで
なにか良い関数はありませんか?

Dim aa as Integer = 2367896

一万の位「6」を四捨五入して「2400000」にしたい!

よきアドバイスをお願いします。


 10万分の1にして、0.5足して、int型に代入し、10万倍する。FAQ「小数点x桁で四捨五入する」と、考え方は同じです。

 この場合、「桁数の制限」をあまり考える必要がないので楽ですね。負数を扱うなら、注意してください。
※-24000は-30000ですか?-20000ですか?
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2003-07-28 18:45
こんばんわ

.NET使ったことがないので分かりませんが、
四捨五入は英語でroundだったと思うので、
この単語をキーワードにソースコードを全検索すれば
もしかしたら見つかるのではないでしょうか。

# そもそも、VB.NETにクラスライブラリのソースコードがついているのであろうか...

なな
ぬし
会議室デビュー日: 2003/06/22
投稿数: 659
お住まい・勤務地: 愛知県
投稿日時: 2003-07-28 19:56
> 四捨五入は英語でroundだったと思うので、

System.Math.Round() です。
mei
大ベテラン
会議室デビュー日: 2003/04/08
投稿数: 114
投稿日時: 2003-07-28 21:09
引用:

ななさんの書き込み (2003-07-28 19:56) より:
> 四捨五入は英語でroundだったと思うので、

System.Math.Round() です。




ヘルプより引用
>Math.Round(3.44, 1); //Returns 3.4.
>Math.Round(3.45, 1); //Returns 3.4.
>Math.Round(3.46, 1); //Returns 3.5.
2番目の例のように、Roundは四捨五入ではなかったはず。

コード:
	Console.WriteLine(System.Math.Round(3.05, 1)); // 3
	Console.WriteLine(System.Math.Round(3.15, 1)); // 3.2
	Console.WriteLine(System.Math.Round(3.25, 1)); // 3.2
	Console.WriteLine(System.Math.Round(3.35, 1)); // 3.4
	Console.WriteLine(System.Math.Round(3.45, 1)); // 3.4
	Console.WriteLine(System.Math.Round(3.55, 1)); // 3.6
	Console.WriteLine(System.Math.Round(3.65, 1)); // 3.6
	Console.WriteLine(System.Math.Round(3.75, 1)); // 3.8
	Console.WriteLine(System.Math.Round(3.85, 1)); // 3.8
	Console.WriteLine(System.Math.Round(3.95, 1)); // 4



多分、偶数丸め。
なな
ぬし
会議室デビュー日: 2003/06/22
投稿数: 659
お住まい・勤務地: 愛知県
投稿日時: 2003-07-28 21:33
なるほど。勉強になります。

ちょっと強引ですが...こんな方法でどうでしょうか?

Console.WriteLine(Convert.ToDouble(String.Format("{0:0.0}", 3.04)).ToString()); // 3.0
Console.WriteLine(Convert.ToDouble(String.Format("{0:0.0}", 3.05)).ToString()); // 3.1
Console.WriteLine(Convert.ToDouble(String.Format("{0:0.0}", 3.06)).ToString()); // 3.1
Console.WriteLine(Convert.ToDouble(String.Format("{0:0.0}", 3.14)).ToString()); // 3.1
Console.WriteLine(Convert.ToDouble(String.Format("{0:0.0}", 3.15)).ToString()); // 3.2
Console.WriteLine(Convert.ToDouble(String.Format("{0:0.0}", 3.16)).ToString()); // 3.2
yamasa
ベテラン
会議室デビュー日: 2003/02/15
投稿数: 80
投稿日時: 2003-07-29 02:08
引用:

Jittaさんの書き込み (2003-07-28 18:32) より:
 10万分の1にして、0.5足して、int型に代入し、10万倍する。FAQ「小数点x桁で四捨五入する」と、考え方は同じです。


そのやり方には大きな落とし穴があります。
計算に浮動小数点を使用していた場合、丸め誤差により
正しくない値になってしまうことがあります。
コード:

using System;
class Sample {
static int MyRound(int value) {
return (int)(value / 100000.0F + 0.5F) * 100000;
}
static void Main(string[] args){
Console.WriteLine(MyRound(10049999));
Console.WriteLine(MyRound(20049999));
}
}
--実行結果--
10000000
20100000
------------


こういう場合は
「5万を加えて、10万で割り(int型のまま)、10万倍する」
のが定石です。

【追記】
もちろん、5万を加えた時点で、intの最大値を超えてしまわないように
注意しなければなりません。

[ メッセージ編集済み 編集者: yamasa 編集日時 2003-07-29 02:13 ]
なな
ぬし
会議室デビュー日: 2003/06/22
投稿数: 659
お住まい・勤務地: 愛知県
投稿日時: 2003-07-29 08:28
> 計算に浮動小数点を使用していた場合、丸め誤差により
> 正しくない値になってしまうことがあります。

float型を使用しているのが問題だと思いますが。
float -> double にした場合、ビット0でAppendされる。)

わたしの場合、浮動小数点型をdoubleに統一することで回避しています。

# C++での経験ですけど。

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