SQL Server、除算はゼロを返します


87

例で使用しているコードは次のとおりです。

 PRINT @set1
 PRINT @set2

 SET @weight= @set1 / @set2;
 PRINT @weight

結果は次のとおりです。

47
638
0

なぜ戻ってくるのか知りたいの0ですが0,073667712


それは「int」です:DECLARE @weight INT
Roch

回答:


156

set1とset2を整数ではなくfloatとして宣言するか、計算の一部としてそれらをfloatにキャストします。

SET @weight= CAST(@set1 AS float) / CAST(@set2 AS float);

24

除算で整数のみを使用すると、整数除算が得られます。(少なくとも1つ)doubleまたはfloatを使用すると、浮動小数点除算(および取得したい答え)が得られます。

だからあなたはできる

  1. 変数の一方または両方をfloat / doubleとして宣言します
  2. 変数の一方または両方をfloat / doubleにキャストします。

整数除算の結果を単にdoubleにキャストしないでください。除算はすでに整数除算として実行されているため、小数点以下の数値はすでに失われています。


4
+1あなたはそれをもう少しよく説明し、値の1つだけがfloat / doubleである必要があると述べたと思うので
Chaulky 2014

11

整数だからです。それらを浮動小数点数または小数として宣言するか、計算でそのようにキャストする必要があります。


@weight変数をfloatに変更した場合、それで十分ですか?
Roch

10

除算の下部を1.0(または必要な小数点以下の桁数)だけ乗算します。

PRINT @set1 
PRINT @set2 
SET @weight= @set1 / @set2 *1.00000; 
PRINT @weight

ありがとう。あなたのコードは私がこれに答えるのを助けました--stackoverflow.com/questions/20532187/… その乗算によって引き起こされた余分なゼロを切り捨てる方法を教えてください。ありがとう。
Trojan.ZBOT 2013

2

floatまたは任意の10進形式として宣言すると、次のように表示されます。

0

のみ

例:

declare @weight float;

SET @weight= 47 / 638; PRINT @weight

出力:0

次のような出力が必要な場合

0.073667712

例えば

declare @weight float;

SET @weight= 47.000000000 / 638.000000000; PRINT @weight

うーん、わかりましたが、除算したい2つの数値は変数であり、変数に.0000が指定されていない場合は機能しないようです。
Roch

したがって、@ set1と@ set2の両方をfloatにキャストする必要があります:)
anishMarokey 2009年

1

SQL Serverでは、結果が浮動小数点数である場合でも、2つの整数を直接除算すると整数が返されます。それを理解するための例を以下に示します。

--1--
declare @weird_number_float float
set @weird_number_float=22/7
select @weird_number_float

--2--
declare @weird_number_decimal decimal(18,10)
set @weird_number_decimal=22/7 
select @weird_number_decimal

--3--
declare @weird_number_numeric numeric
set @weird_number_numeric=22/7 
select @weird_number_numeric

--Right way

declare @weird_number float
set @weird_number=cast(22 as float)/cast(7 as float)
select @weird_number

最後のブロックだけで3,14285714285714が返されます。正しい精度で定義された2番目のブロックにもかかわらず、結果は3.00000になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.