少数の四捨五入の方法を教えてください への返答
投稿で使用できる特殊コードの説明。(別タブで開きます。)
以下の返答は逆順(新しい順)に並んでいます。
投稿者 Nightmare  (社会人)
投稿日時
2009/2/23 21:05:38
遅レス失礼します。
>たしか、VBのFormat関数って、四捨五入じゃなくって
>丸め処理をするんじゃなかったかな?
え(汗)そうでしたっけ(汗)
検証を行わずに考えたもので間違ってるかもしれませんね(汗)
ということで検証をしてみた所…
Format(((2.6+4.3)/2),"#.0") → 3.5
と出ました。違う数式も入れてみましたが四捨五入をしている結果がでました。
ですが、かずいさんの
>それで昔、えらい目に会った記憶があったので・・・。
という言葉が気になり調べた所、
・Windows XP と Windows 2000 で Visual Basic 6.0 の
Format 関数を使用して 四捨五入 を行うと結果が異なる。
という問題があるそうです。
問題が発生した場合は、
丸め処理の対象となる 数値が5の場合 その1桁前の数字が 偶数で
あれば 繰り下げ、奇数であれば 繰り上げられており銀行系の丸め処理
を行い、Round関数と同じ動きをするらしいです。(検証は行っていません)
問題を回避される場合は、fix処理(fix関数+小数点以下の数字)を行うか
もしくは、Service Pack の適用を促す必要があるそうです。
現在は、
※ WindowsXP は Service Pack 1 以降 未適用の場合に発生。
Service Pack 1以降を適用していれば この現象は発生しません。
らしいです。詳しくは
http://support.microsoft.com/kb/418691/ja
http://www.timetable-info.com/memo/xp2000vb.htm
を参照して下さい。
自身が考えていたよりformat関数は難しいですね(汗)
使用する場合は注意が必要という考えを持ちました。
かずいさんご指摘ありがとうございました。
>たしか、VBのFormat関数って、四捨五入じゃなくって
>丸め処理をするんじゃなかったかな?
え(汗)そうでしたっけ(汗)
検証を行わずに考えたもので間違ってるかもしれませんね(汗)
ということで検証をしてみた所…
Format(((2.6+4.3)/2),"#.0") → 3.5
と出ました。違う数式も入れてみましたが四捨五入をしている結果がでました。
ですが、かずいさんの
>それで昔、えらい目に会った記憶があったので・・・。
という言葉が気になり調べた所、
・Windows XP と Windows 2000 で Visual Basic 6.0 の
Format 関数を使用して 四捨五入 を行うと結果が異なる。
という問題があるそうです。
問題が発生した場合は、
丸め処理の対象となる 数値が5の場合 その1桁前の数字が 偶数で
あれば 繰り下げ、奇数であれば 繰り上げられており銀行系の丸め処理
を行い、Round関数と同じ動きをするらしいです。(検証は行っていません)
問題を回避される場合は、fix処理(fix関数+小数点以下の数字)を行うか
もしくは、Service Pack の適用を促す必要があるそうです。
現在は、
※ WindowsXP は Service Pack 1 以降 未適用の場合に発生。
Service Pack 1以降を適用していれば この現象は発生しません。
らしいです。詳しくは
http://support.microsoft.com/kb/418691/ja
http://www.timetable-info.com/memo/xp2000vb.htm
を参照して下さい。
自身が考えていたよりformat関数は難しいですね(汗)
使用する場合は注意が必要という考えを持ちました。
かずいさんご指摘ありがとうございました。
投稿者 かずい  (社会人)
投稿日時
2009/2/21 02:20:39
遅レス失礼します。
たしか、VBのFormat関数って、四捨五入じゃなくって
丸め処理をするんじゃなかったかな?
今、手元に環境がないので検証していないですが、
それで昔、えらい目に会った記憶があったので・・・。
たしか、VBのFormat関数って、四捨五入じゃなくって
丸め処理をするんじゃなかったかな?
今、手元に環境がないので検証していないですが、
それで昔、えらい目に会った記憶があったので・・・。
投稿者 Nightmare  (社会人)
投稿日時
2009/2/19 20:03:08
レス失礼します。
Format関数とかはどうでしょうか?
(2008版でも出来るのかはわかりませんが(汗))
Format(((2.6+4.3)/2),"#.0")
ですかね。
終わっている見たいなので流し読みでお願いします。
Format関数とかはどうでしょうか?
(2008版でも出来るのかはわかりませんが(汗))
Format(((2.6+4.3)/2),"#.0")
ですかね。
終わっている見たいなので流し読みでお願いします。
投稿者 るきお  (社会人)
投稿日時
2009/2/19 06:45:19
こんにちは。
Math.Roundを使うという方法もあります。
こんな感じです。
小数点以下桁数を数字で指定するところと、普通の四捨五入か偶数丸めか選べるところがToStringの書式変換と異なります。
Math.Roundを使うという方法もあります。
こんな感じです。
TextBox1.Text = Math.Round((2.6 + 4.3) / 2, 1, MidpointRounding.AwayFromZero)
小数点以下桁数を数字で指定するところと、普通の四捨五入か偶数丸めか選べるところがToStringの書式変換と異なります。
投稿者 ぼけ老人  (社会人)
投稿日時
2009/2/19 00:52:43
BVを始めたばかりの老人です。
刈谷勇さん、有難うございました。できました。
老婆さん、良いサイトを教えていただいて有難うございます。勉強してみます。
また教えてください。本当に有難うございました。
刈谷勇さん、有難うございました。できました。
老婆さん、良いサイトを教えていただいて有難うございます。勉強してみます。
また教えてください。本当に有難うございました。
投稿者 老婆  (社会人)
投稿日時
2009/2/18 23:36:13
http://www.microsoft.com/japan/msdn/student/challenge/chap1_vb/
こんなサイトも参考になりますよ
老婆心ながら
こんなサイトも参考になりますよ
老婆心ながら
投稿者 刈谷勇  (社会人)
投稿日時
2009/2/18 22:59:41
>BVを始めたばかりの老人です。
VBですね。重箱の箱をつつくようですみません。
((2.6 + 4.3) / 2).ToString("#,##0.#")
で出来ると思います。
VBですね。重箱の箱をつつくようですみません。
((2.6 + 4.3) / 2).ToString("#,##0.#")
で出来ると思います。
投稿者 ぼけ老人  (社会人)
投稿日時
2009/2/18 22:40:56
BVを始めたばかりの老人です。
(2.6+4.3)/2=3.45 少数点第2位を四捨五入して、TextBoxに3.5と表示させたいのです。
無料2008版を使っています。
あまりにも幼稚な質問で申し訳ありませんがよろしくお願いいたします。
(2.6+4.3)/2=3.45 少数点第2位を四捨五入して、TextBoxに3.5と表示させたいのです。
無料2008版を使っています。
あまりにも幼稚な質問で申し訳ありませんがよろしくお願いいたします。
なるほど、VB6でサービスパック未適用だと発生するのか
そこまで詳しく調べてなかったです。
えらい目に会ったのが10年近く前だったんで(^^;
大変勉強になりました。
スレ主さんの環境は「2008Express Edition」みたいなので、
この現象は発生しないから大丈夫っぽいですね。