如何使用T-SQL将两个整数相除得到浮点结果?

255

我想使用 T-SQL 和 Microsoft SQL Server,在两个整数相除时指定小数位数,例如:

select 1/3

目前返回0。我希望它返回0,33

类似这样:

select round(1/3, -2)

但那样做并不起作用。我该如何达到所需的结果?


4
你试过 1.0 / 3 吗? - Thilo
我得到的答案已经足够了。 - UnDiUdin
10个回答

394

如果您需要使用现有的整数字段或参数,则可以首先将它们转换为浮点数,stb和xiowl提供的建议对于寻找常量是可以的:

SELECT CAST(1 AS float) / CAST(3 AS float)
或者
SELECT CAST(MyIntField1 AS float) / CAST(MyIntField2 AS float)

2
或者你可以将它们转换为十进制数,如果你想要一个十进制结果。 - Tim
59
选择1.0乘以MyInt1除以MyInt2。 - Troglo
@TroubleZero 对于MySQL使用 decimal - itsazzad
非常感谢,你救了我的一天。我尝试使用CAST(7/3 AS float),但仍然返回2。所以转换数字解决了我的问题。 - Yasin Yörük
4
无需同时转换被除数和除数,参见 @M.S. 的答案 https://dev59.com/Jmgt5IYBdhLWcg3w7BoE#30639343。 - robotik
显示剩余2条评论

89

因为SQL Server执行整数除法。请尝试以下代码:

select 1 * 1.0 / 3

当你将整数作为参数传递时,这非常有用。

select x * 1.0 / y

2
你甚至可以省略零。 - John

59

不需要同时转换两个数据类型。在除法运算中,结果的数据类型始终是具有较高 数据类型优先级 的那个。因此解决方案应该是:

SELECT CAST(1 AS float) / 3
或者
SELECT 1 / CAST(3 AS float)

34
select 1/3.0

这样做就可以了。


18
我知道在MySQL中将CASTFLOAT是不允许的,尝试执行CAST(1 AS float)会导致错误,如MySQL dev所述。
解决这个问题的方法很简单。只需要执行下面的操作:
(1 + 0.0)

然后使用ROUND函数来实现保留指定小数位数,例如:

ROUND((1+0.0)/(2+0.0), 3)

以上SQL将1除以2并返回一个3位小数的浮点数,就像这样:0.500

可以将数据类型CAST为以下类型:binary、char、date、datetime、decimal、json、nchar、signed、timeunsigned


5
MySQL允许使用CAST,但不允许将类型转换为FLOAT。请改为转换为DECIMAL。例如,请参考https://dev59.com/sms05IYBdhLWcg3wPPaB。 - markusk
太棒了。如此简单。感谢您的发布。 - sharon

9

看起来这个技巧在SQL Server中也能用,并且更简短(基于之前的答案)。

SELECT 1.0*MyInt1/MyInt2

或者:

SELECT (1.0*MyInt1)/MyInt2

2
我最喜欢这个,即使是用于百分比计算,它看起来也很好: SELECT 100.0 * @Elapsed / @Total - EliSherer

3

使用方法

select cast((1*1.00)/3 AS DECIMAL(16,2)) as Result

在这个SQL语句中,首先将数字转换为浮点数或者乘以1.00,输出结果将是一个浮点数。在此例子中,我考虑了两位小数。您可以根据需要自行选择。


3

如果你来到这里(就像我一样)是为了寻找整数值的解决方案,那么这里就是答案:

CAST(9/2 AS UNSIGNED)

返回5


1

在Teradata中,我很惊讶地看到select 0.7/0.9返回了0.8,因为它们已经是浮点数/十进制数!我不得不使用cast(0.7 as float)来获得我想要的输出。


0

在使用字面量时,最好的方法是“告诉”SQL你指的是哪种类型。

如果你想要一个十进制结果,在数字后面加上小数点“.0”:

SELECT 1.0 / 3.0
Result
0.333333

如果你想要一个浮点(实数)结果,在数字后面加上“e0”即可:
SELECT 1e0 / 3e0
Result
0.333333333333333

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接