この質問に優れた回答がすでに追加されているにもかかわらず、SQL Serverでのデータ型の変換には、明示的に定義された優先順位があります。
演算子が異なるデータ型の2つの式を組み合わせる場合、データ型の優先順位の規則は、優先順位の低いデータ型を優先順位の高いデータ型に変換することを指定します。変換がサポートされている暗黙の変換ではない場合、エラーが返されます。両方のオペランド式のデータ型が同じ場合、演算の結果はそのデータ型になります。
SQL Serverは、データ型に次の優先順位を使用します。
user-defined data types (highest)
sql_variant
xml
datetimeoffset
datetime2
datetime
smalldatetime
date
time
float
real
decimal
money
smallmoney
bigint
int
smallint
tinyint
bit
ntext
text
image
timestamp
uniqueidentifier
nvarchar (including nvarchar(max) )
nchar
varchar (including varchar(max) )
char
varbinary (including varbinary(max) )
binary (lowest)
したがって、たとえば、SELECT 0.5 * 1
(10進数にintを乗算して)結果が10進数値に変換される場合、データ型よりも優先順位decimal
が高いためですint
。
詳細については、http://msdn.microsoft.com/en-us/library/ms190309.aspxを参照してください。
以上のことをすべて言っても、実際にはすべての入力が10進数であるため、おそらく10進数の値を返すSELECT @C * (@I * POWER(1 + @I, @N) / (POWER(1 + @I, @N) - 1 ));
はずです。興味深いことに、それSELECT
を次のように変更することにより、正しいように見える結果を強制できます。
DECLARE @N INT = 360;
DECLARE @I DECIMAL(38,26) = 0.15 * 30 / 360;
DECLARE @C DECIMAL(38,26) = 1000000;
SELECT @C * @I * POWER(1 + @I, @N) / (POWER(1 + @I, @N) - 1);
SELECT @C * (@I * POWER(1 + @I, @N) / (POWER(1E0 + @I, @N) - 1));
これは次を返します:
私が説明するために途方に暮れていますかはっきりけれどもそれは、任意の違いはそれがありません。私の推測では、関数の1E0
(明示的な浮動小数点)は、POWER(
SQL ServerにPOWER
関数の出力タイプに対して異なる選択を行わせます。私の仮定が正しい場合、ドキュメントの最初の入力は浮動小数点数、または暗黙的に浮動小数点数に変換できる数値であると記載されているPOWER
ため、関数のバグの可能性を示しています。POWER()