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

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

新規登録して質問してみよう
ただいま回答率
85.48%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

17121閲覧

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

primetimefuture

総合スコア46

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

1クリップ

投稿2018/02/27 04:53

自動車の排気量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

該当のソースコード

SQLSERVER

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

試したこと

問題を解決する為に以下の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/ツールのバージョンなど)

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

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

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

投稿2018/02/27 06:35

編集2018/02/27 06:37
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2018/02/27 06:44

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

2018/02/28 03:42

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

退会済みユーザー

2018/02/28 04:28

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

0

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

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

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

投稿2018/02/27 04:58

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

primetimefuture

2018/02/28 03:47

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

0

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

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

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

投稿2018/02/27 05:09

編集2018/02/27 05:14
koizumi

総合スコア230

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/02/27 06:31

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

2018/02/28 03:44

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問