web-dev-qa-db-ja.com

SQL Serverが2つの整数を除算した結果を四捨五入するのはなぜですか?

整数としてパーセンテージを含むsmallint列のテーブルがあります(つまり、50、75、85など)。

この列を100で割ると、次のようになります。

SELECT MY_COLUMN/100 AS PCT_AS_FRACTION
FROM MY_TABLE

結果は最も近い整数に丸められます。たとえば、数値「50」を含む行の場合、結果としてゼロが返されます。

私はこれを簡単なステートメントで複製することができます:

SELECT 50 / 100 AS TEST_VALUE

それはなぜですか、そしてどうすれば結果の精度を上げることができますか?

22
JosephStyons

整数除算(整数を整数で除算)を行うと、常に整数の答えが得られます。 50/100 = .50、これは整数で0です。

MY_COLUMNを100.0で割ってみましたか?

32

整数をキャストします。

SELECT (cast(50 AS float)/100)
25
boj

あなたは整数除算をしています。 50/100は0で、余りは50です。

浮動小数点除算を使用する必要があります。

1
Michael

注意-整数除算の余りは丸められないことに注意してください。むしろ、それは落とされます。これは、FLOORsql関数を呼び出すのと同じです。

これは一般的であり、2つの整数を乗算するときに分数が発生しないため、そのように定義されます。したがって、整数を乗算するときに分数処理の方法論が想定されることはありませんが、整数の除算については同じことが言えません。

これは、SQLでdateTime演算を実行するときに影響を与えることがよくあります。

1
Milan

/(Divide) 演算子を使用している場合

優先順位の高い引数のデータ型を返します。

そして

整数被除数を整数除数で除算すると、結果は結果の小数部分が切り捨てられた整数になります。

したがって、少なくとも1つのオペランドを適切な型にキャストする必要があります: 10進数および数値 または 浮動小数点または実数

1
gotqn

2つの整数を除算すると、別の整数になります。

そのようにキャストすることも可能であるはずです

SELECT(50/100)::数値;

0
PepperBob