質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.91%

SQLSERVERのROUND関数(切り捨て)の答えがおかしい

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 10K+

自動車の排気量ccをリットル(車検証記載の方式でccの1の位は切り捨てする条件)に変えるSQL文を作成していましたが、お客様からおかしいと指摘を受け、調べてみると不可解な現象に悩んでしまいました。おバカな質問かもしれませんが宜しくお願いします。

 前提・実現したいこと

自動車の排気量ccをリットル(車検証記載の方式でccの1の位は切り捨てする条件)に変えるSQL文を作成していましたが、お客様から間違ってると指摘を受け、調べてみると不可解な現象に悩んでしまいました。おバカな質問かもしれませんが宜しくお願いします。

求めている結果は以下の通りなのですが、
軽自動車 658cc → 0.65L
普通車A  2990cc → 2.99L
普通車B  3630cc → 3.63L 

自分が作成したSQL文
SELECT round([排気量cc]/1000,2,1) from [車両データテーブル]

を実行すると なぜだか普通車Bの結果が3.62となってしまいます。
SELECT round([排気量cc],-1,1)/1000とすると3.63となるのですが原因が分からなくてもやもやしています。

ちなみに[排気量cc]カラムはfloatです。

 発生している問題・エラーメッセージ

SELECT round(3630/1000,2,1) の結果が3.62

 該当のソースコード

SELECT round([排気量cc]/1000,2,1) from [車両データテーブル]

以下だと計算結果が正しくなる
SELECT round([排気量cc],-1,1)/1000 from [車両データテーブル]

 試したこと

問題を解決する為に以下のSQL文を実行
SELECT [排気量cc],
round([排気量cc]/1000,2,1) ,
round([排気量cc],-1,1)/1000 from [車両データテーブル]

結果
658 0.65 0.65
2990 2.99 2.99
3630 3.62 3.63

 補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+5

banker's roundingのことをSQLでROUND関数を使う人は覚えておくべきです。
端数処理 - Wikipedia
Round() 関数は四捨五入関数ではない: ITコンサルタント 市井賢児のメモ
もしも四捨五入だと訳している解説があったら焼き捨ててください。

被除数に0.5を足してから割って、整数値部分のみ採用してください。
FLOOR()で指定桁位置で切り捨てできますので。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/27 15:44

    どんなものを使うにしても、仕様はきっちり確認しないといけませんね。

    キャンセル

  • 2018/02/28 12:42

    あ~なんか遠い昔に聞いたことあったような、、というか普通は知ってて当たり前の常識だったんでしょうか?なんかお恥ずかしい限りです。ありがとうございます。

    キャンセル

  • 2018/02/28 13:28

    私もハマったクチですから。他の処理系で同名の関数があるとつい思い込みで使ってしまいたくなりますよね。

    キャンセル

+3

ちなみに[排気量cc]カラムはfloatです。

floatは2進法の小数になっていて、0.1すら正確に表現できないので、切り捨てや切り上げなどをすると、細かい誤差が利いてきて思わぬ値になることがあります。

SQL ServerにもDECIMAL型がありますので、それを選んでおきましょう(358.29573ccみたいにえんえん桁が続くこともないでしょうし)。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/28 12:47

    やっぱDECIMAL型の方がいいんですね。勉強になります。今回は既存のメーカー製ソフトからのデーター連携開発だったんですが、今度他メーカーはどうしているか気にしてみてみることにします。ありがとうございました

    キャンセル

+1

古い情報ですが、windowsの仕様で、round関数は偶数に寄せるようになっていました。

4年ほど前の情報ですが、今はどうなんだろう?

正式名称は 「最近接偶数への丸め」というらしい、、、

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/27 15:31

    banker's roundingってやつです。参考:Round() 関数は四捨五入関数ではない: ITコンサルタント 市井賢児のメモ <http://ichy.seesaa.net/article/2842259.html>

    キャンセル

  • 2018/02/28 12:44

    「最近接偶数への丸め」って言うんですか、今度周りのみんなに知ってるか聞いてみよっと。ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る