要学习这些,肯定是我犯错了...
如果我DECLARE
是一个实数(或十进制)局部变量,我不能分配(SET
)一个表达式的值吗?我必须先设置一个值,然后逐步执行表达式。如果我一次尝试全部“做数学”,就会得到0
。
所以,这可行。
DECLARE @HitRate real
SET @HitRate = 805499
SET @HitRate = (@HitRate / 847125) * 100
--SET @HitRate = (805499 / 847125) * 100 --But this does not work?
SELECT @HitRate
SET
语句,而仅使用第3条,我得到0
3
,我将得到0
CAST(@HitRate As DECIMAL(9,2))
我得到0
答案 0 :(得分:1)
demo,您需要将805499设置为805499.00,这意味着int要浮动
DECLARE @HitRate real
SET @HitRate = 805499
SET @HitRate = (@HitRate / 847125) * 100
SET @HitRate = (805499.00 / 847125) * 100.00 --this will work now
SELECT @HitRate
您得到0是因为805499/847125 = 0.95,但是db引擎返回0是因为它是一个整数值,这就是为什么当您将100与0相乘时也会输出0
或者您可以像下面这样明确cast
SET @HitRate = (cast( 805499 as float) / 847125) * 100
它还将返回95.0862
答案 1 :(得分:1)
如果使用以下语句
SET @HitRate = (805499 / 847125) * 100
因为0
和805499
是整数,所以它将返回847125
,因此除法的结果是integer = 0
。
基于TSQL division official documentation:
返回优先级较高的参数的数据类型。
如果将整数除数除以整数除数,则结果是整数,其结果的任何小数部分都会被截断。
您可以从下面的链接检查SQL数据类型优先级列表:
但是当您使用时:
DECLARE @HitRate real
SET @HitRate = 805499
SET @HitRate = (@HitRate / 847125) * 100
SELECT @HitRate
它将返回95.0862
,因为@HitRate
的类型为real
,并且优先级高于整数
答案 2 :(得分:0)