DOBON.NET DOBON.NETプログラミング掲示板過去ログ

VB.NETとVB6の浮動小数(Double)の計算結果の違い

環境/言語:[環境(WindowsXP Pro)、使用言語(VB.NET 2003)、.NET Framework(1.1)]
分類:[.NET]

はじめまして、GONと申します。
VB.NETとVB6の浮動小数(Double)の計算結果の違いについてご教示ください。

VB6で正しく計算できていたものがVB.NETでは異なる結果となります。
具体的には下記の数値の計算結果なのですが、
この結果の小数第三位を四捨五入したものがほしいため、
結果として4.28がほしいところが4.27となってしまいます。

[VB6]
4.5 × 0.95 = 4.275

[VB.NET]
4.5 × 0.95 = 4.2749999999999995

※この数値以外でもあります。
数値を変数(Double)に入れても同じ結果となります。
確認のためにコンソールへ出力すると正しく表示されます。
Singleでは正しく計算されます。

Console.WriteLine(4.5 * 0.95)
出力→4.275

現在はDecimalへ変更して検証しておりますが、
Doubleの結果が納得いかない状態です。
この計算仕様のことをご存じの方がいらっしゃいましたらご教示ください。
よろしくお願いいたします。
> [VB6]
> 4.5 × 0.95 = 4.275

これは、「処理系と数値によってたまたまそうなることもある」と考えるべきでしょう。

> [VB.NET]
> 4.5 × 0.95 = 4.2749999999999995

こうなるのが普通ですので、この類の計算には浮動小数点を使わないということになると思います。
System.Decimalを使う。
回答ありがとうございます。

やはり用途に合わせて使い分けないといけないですね。
いくらIEEEで規格化されていても、
規定されていない部分で違いがでてくる訳ですね。
(同じパソコンでVBのバージョン違いで結果の違いが出るとは
想像もしていませんでした。)

引き続きDecimalで検証を続けようと思います。
ありがとうございました。
解決済み!
■No17381に返信(GONさんの記事)
> (同じパソコンでVBのバージョン違いで結果の違いが出るとは
> 想像もしていませんでした。)

名称は同じVBかもしれませんが、VBランタイムと.NET Frameworkじゃ全く違いますよね。
解決済み!
> 名称は同じVBかもしれませんが、VBランタイムと.NET Frameworkじゃ全く違いますよね。

全くその通りですね。
今回改めて浮動小数を認識させられました。
はじめは、浮動小数の計算はCPUの機能で行っているのでは?
と思っていたものですから。
(PCの仕組みをよく分かっていないのかもしれません。)
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板