0

SQL Server 2008 R2 と SQL Server 2012 を使用して次のことを試していますが、両方で同じ結果が得られます。

次のステートメントを書くとします。

select round(4.005, 2)

期待される結果が得られます: 4.01

ただし、次のステートメントを書く場合:

declare @result float
select @result = 4.005
select round(@result, 2)

予期しない結果が得られました: 4

しかし、前のステートメントでfloatrealに置き換えると、次のようになります。

declare @result real
select @result = 4.005
select round(@result, 2)

期待どおりの結果が得られます。

なぜこれが起こっているのか誰にも教えてもらえますか?

4

2 に答える 2

1

浮動小数点数の仮数を科学表記法で格納するために使用されるビット数を指定していないため、これを試してください。

declare @result float(5)
select @result = 4.005
select round(@result, 2)
于 2013-02-25T17:29:59.030 に答える
0

これは、float が近似データ型であることに関係しています。

参照: http://technet.microsoft.com/en-us/library/ms187912(v=sql.105).aspx

float および real データ型は、近似データ型として知られています。float と real の動作は、近似数値データ型に関する IEEE 754 仕様に従います。近似数値データ型は、多くの数値に対して指定された正確な値を格納しません。それらは値の非常に近い近似値を保存します。多くのアプリケーションでは、指定された値と保存された近似値とのわずかな違いは目立ちません。ただし、場合によっては、違いが顕著になります。float と real のデータ型はおおよその性質を持っているため、金融アプリケーション、丸めを伴う操作、等価チェックなど、正確な数値動作が必要な場合は、これらのデータ型を使用しないでください。代わりに、integer、decimal、money、または smallmoney データ型を使用してください。WHERE 句の検索条件、特に = 演算子と <> 演算子では、float 列または real 列を使用しないでください。float 列と real 列を > または < 比較に制限することをお勧めします。

IEEE 754 仕様では、最も近い値に丸める、切り上げる、切り下げる、ゼロに丸めるという 4 つの丸めモードが用意されています。Microsoft SQL Server は切り上げを使用します。すべてが保証された精度で正確ですが、わずかに異なる浮動小数点値になる可能性があります。浮動小数点数の 2 進数表現では、多くの正当な丸めスキームの 1 つが使用される可能性があるため、浮動小数点値を確実に定量化することは不可能です。

于 2013-02-25T19:10:36.660 に答える