- ベストアンサー
Float型の時の計算結果がおかしい
- 質問者はMicrosoft SQL Server2000を使用していて、Float型の計算結果がおかしいという問題に遭遇しています。
- 特に、23.0 - 22.1の計算結果が0.899999999999999となってしまっており、正しく0.9と出したいとのことです。
- 質問者はSQL2008環境で互換モードを使用しても同様の現象が発生しているため、どこが間違っているのかを知りたいとしています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
間違ってはいません。 しかし浮動小数点データは概数であるため、データ型の範囲に含まれるすべての値を正確に表せるわけではありません。 SQLServer 2008 などの概数型は IEEE754 仕様に従っています。 概数型では、多くの場合、指定されたとおり正確な値が格納されません。正確な値にきわめて近い概数が格納されます。多くのアプリケーションでは指定した値と格納される概数のわずかな差は問題にはなりません。ただし、その差が問題になる場合もあります。float 型と real 型にはこのような概数の性質があるので、財務アプリケーション、丸めが行われる演算、等価性のチェックなど、正確な数値動作が必要な場合には、これらのデータ型を使用しないでください。 代わりに、int 型、decimal 型、money 型、smallmoney 型を使用することをお勧めします。 実際にはどういうことなのか、多少極端ですが、例を上げてみましょう。 いま、ここで新しいCPUを構想していて、4ビットで 0.00~4.00 までの実数を表現するものを考えているとします。 この例題で、4 ビットのうちの上位2ビットを 1の位、下位2ビットを小数点以下の位にすると仮定した場合、小数点以下は2ビットしかありませんから、2進数の 00 を 0.00、2進数の 01 を 0.025、2進数の 10 を 0.05、2進数の 11 を 0.075 と表現する合計4つのみとなります。そして、1の位は 0、1、2、3 です。 この範囲で表現できる数値では正確な4は表現できませんが、概数として表せば、3.75 が一番4に近い数値となるわけです。 実際にはもう少しビット数が多いわけですが、おおむねこのような仕組みで実数が表現されています。
その他の回答 (2)
- nicotinism
- ベストアンサー率70% (1019/1452)
おかしくなって当然です。 回避策は、#2 さんがしめされているので なぜか? の部分をExcelの場合で説明されています。 SQLServer でも考え方は一緒です。 ※ #2 さんの詳しい解説ですね。 日経PC21 / エクセル(Excel)「演算誤差」対策講座 http://pc.nikkeibp.co.jp/pc21/special/gosa/
お礼
ご回答ありがとうございました。 リンクも張って頂き、参考になりました。
- Tacosan
- ベストアンサー率23% (3656/15482)
多分 Float で計算したときに正確な値が得られると思い込んでいる ところが間違ってると思う.
お礼
ご回答ありがとうございました。 No2さんの回答で、少し理解しました。
お礼
詳しいご回答ありがとうございました。 以下の様なやり方で、正しく出来そうです。 少数桁は、4桁までなのでMONEY型処理で大丈夫そうです。 SELECT [Field01] AS 'Field01' ,[Field02] AS 'Field02' ,(CAST([Field01] AS MONEY) - cast([Field02] AS MONEY) ) AS '正01' ,(CAST(([Field01]-[Field02]) AS MONEY) ) AS '正02' FROM [dbo].[Table01] しかし、浮動小数点ってやっかいな型なのですね。 勉強になりました。