VB6.0用掲示板の過去のログ(No.2)−VBレスキュー(花ちゃん)
[記事リスト] [新規投稿] [新着記事] [ワード検索] [管理用]

投稿日: 2005/05/21(Sat) 08:51
投稿者花ちゃん
Eメール
URL
タイトルRe^2: VBのバグです

List1.AddItem CInt(0.0282 * 10000)
List1.AddItem Int(0.0282! * 10000!)
List1.AddItem Int(0.0282@ * 10000)

> 以下確認用に使用したプログラムです。VB6.0のデバッグモードでかつ2回目以降に
>現象が発生します。他は正常です。これって、やっぱりバグでしょう。

私の環境では、1回目も2回目も同じで 281 です。


こちらの方の抜粋の方が適切でした。
紛らわしい事を書いておりましたので訂正しておきます。
(ご迷惑をお掛けしました。)

------------ 以下 サポート技術情報より抜粋 -------------
[VB4 ] データ型と演算誤差についての注意 より

丸め
Int関数やFix関数での切り捨てや、整数型や文字列への変換時の丸めでも注意が必要です。
例えばけた上げをして切り捨てた結果を表示する次のようなコードがあります

Dim a As Double
Print Fix(a * 10)

ここで変数aに0.3という値が格納されていた場合、結果には3が期待されますが、実際には2が表示されます。これは0.3が近似表現されており、さらにその近似値が0.3より小さいために出る結果です。
このような問題では、精度が高いデータ型を利用したほうが期待通りの結果を出すとは限りません。例えば0.3は単精度では過剰近似値 (0.3000000...) で表されるため、同じ処理で3という結果になりますが、倍精度では不足近似値 (0.299999999999...) で表されるため結果は2になります。切り捨てた結果では単精度のほうが精度が高いように見えますが、切り捨て前の値は倍精度のほうがより0.3に近い値で格納されています。
同じ問題はFormat関数でも発生します。Format関数での丸めは四捨五入ですから、例えば0.35を "0.0"という書式で出力する場合には "0.4" という結果が期待されます。ところが0.35は内部で0.349999... と表現されているため結果は "0.3" になります。
(原文のまま)

尚、VB4.0の当時の記事であり、現在は、Format関数での丸め処理の仕方が変っております。


- 関連一覧ツリー (★ をクリックするとツリー全体を一括表示します)

- 返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)

- VBレスキュー(花ちゃん) - - Web Forum -