8

次の 2 つのクエリがあるとします。

select sum(cast(2666 as float)) * cast(.3 as float)
select sum(cast(2666 as real)) * cast(.3 as real)

1 番目のクエリは次を返します799.8
。 2 番目のクエリは次を返します。799.800031781197

2 番目のクエリが 1 番目と同じものを返さないのはなぜですか?

4

1 に答える 1

19

2 進浮動小数点型 (real や float など) は、10 進数を正確に表すことができません。特に、2 進浮動小数点数として 0.3 を正確に格納することはできません。代わりに、0.3 に非常に近い数値が格納されます。これは表現エラーと呼ばれます。

real と float では精度が異なるため、誤差の大きさが異なります。

10 進数をより正確に格納する場合は、decimal または numericの使用を検討してください。ただし、これらの型は特定の桁数までの 10 進数値を正確に格納できますが、計算によって正確に表現できない数値が生成される可能性があることに注意してください。たとえば、 の結果はと の両方に0.1 / 0.3格納できますが、正確に格納することはできません。この場合、結果は型に格納できる最も近い値に丸められます (たとえば、精度に応じて)。decimal0.10.30.333333333

于 2012-05-22T18:14:03.700 に答える