none
SQLServer2008のRound関数の動作について RRS feed

  • 質問

  • 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なし
    2009年12月15日 2:39

回答

  • 資料が少し古いですが、以下より「対称的な算術型丸め」になるようです。

    丸めを行うカスタム プロシージャを実装する方法
    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
    2009年12月15日 5:10

すべての返信

  • 資料が少し古いですが、以下より「対称的な算術型丸め」になるようです。

    丸めを行うカスタム プロシージャを実装する方法
    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
    2009年12月15日 5:10
  • ご回答ありがとうございます。

    > 「対称的な算術型丸め」になるようです。
    なるほど。
    float型で渡した場合は「偶数丸め」になるというのは完全に勘違いでした。お恥ずかしい・・・


    > なおfloatにキャストすると2.9249999999999998になり
    floatにキャストしたものをDecimal(38,28)とかに再キャストしてみたら仰る通り「2.9424999・・・・」になりました。

    ROUND関数を使用する際にはきっちりDecimalにキャストしてから処理するようにします。

    ありがとうございました。
    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 ※追加
    2009年12月15日 7:20