トップ回答者
SQLServer2008のRound関数の動作について

質問
-
SQLServer2008においてROUND関数の動きがつかめず困っています。
ROUNDの第1引数にfloat型で渡した場合は「偶数丸め」になり、
Decimal型で渡した場合には「(日本で一般的な)四捨五入」になっているようなのです。
SELECT ROUND(CAST('2.925' AS FLOAT),2) -->2.92
SELECT ROUND(CAST('2.925' AS DECIMAL(18,9)),2) -->2.93
SELECT ROUND(CAST('5.225' AS FLOAT),2) -->5.22
SELECT ROUND(CAST('5.225' AS DECIMAL(18,9)),2) -->5.23
最終的に行いたいことは四捨五入(偶数丸めでない)なので、
ROUNDに渡す際にはDecimalにCASTするようにすれば良いのかなと思っているのですが
正しいのでしょうか?(Decimalなら必ず四捨五入になるのか・・・?)
ヘルプやWebで検索したのですが、上記のような動作をするという説明が見つからなかったので投稿させていただきました。
動作環境
WindowsXP Pro SP3
SQLServer2008 Developer SPなし
回答
-
資料が少し古いですが、以下より「対称的な算術型丸め」になるようです。
丸めを行うカスタム プロシージャを実装する方法
http://support.microsoft.com/kb/196652/jaなおfloatにキャストすると2.9249999999999998になり、decimal(18,9)にキャストすると2.925000000になるため、ご質問された結果になるのでしょう。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/- 回答としてマーク えむけ 2009年12月15日 6:14
すべての返信
-
資料が少し古いですが、以下より「対称的な算術型丸め」になるようです。
丸めを行うカスタム プロシージャを実装する方法
http://support.microsoft.com/kb/196652/jaなおfloatにキャストすると2.9249999999999998になり、decimal(18,9)にキャストすると2.925000000になるため、ご質問された結果になるのでしょう。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/- 回答としてマーク えむけ 2009年12月15日 6:14
-
「DECIMAL へのキャストでNGなケースについて」
ただし、一般化としての話なので、“業務的に問題無しならOK”であれば関係ないかもしれません。話を float → decimal 変換に絞ります。
値が 0.00001111115 だと DECIMAL(XX,9) では少数桁が足りません。 注)float の有効桁数は7桁。※
ではということで DECIMAL(XX,20) に変えると
今度は 2.9249999999999998 → 2.925 への変換がおこなわれません。
※有効桁数について詳しくはこちら。
float 型と real 型 (Transact-SQL) http://technet.microsoft.com/ja-jp/library/ms173773(SQL.90).aspx- 編集済み anningo 2009年12月15日 7:41 ※追加