在MSSQL中,对于真正的列类型,我发现了Round函数的怪异或奇怪行为。我已经在Azure SQL DB和SQL Server 2012中测试了此问题
为什么@ number = 201604.125返回201604.1吗?
为什么要舍入(1.12345,10)返回1.1234500408?
-- For Float column it working as expected
-- Declare @number as float,@number1 as float;
Declare @number as real,@number1 as real;
set @number=201604.125;
set @number1=1.12345;
select @number as Realcolumn_Original
,round(@number,2) as Realcolumn_ROUND_2
,round(@number,3) as Realcolumn_ROUND_3
, @number1 as Realcolumn1_Original
,round(@number1,6) as Realcolumn1_ROUND_6
,round(@number1,7) as Realcolumn1_ROUND_7
,round(@number1,8) as Realcolumn1_ROUND_8
,round(@number1,9) as Realcolumn1_ROUND_9
,round(@number1,10) as Realcolumn1_ROUND_10
答案 0 :(得分:4)
我 怀疑 ,您在这里问的是为什么:
DECLARE @n real = 201604.125;
SELECT @n;
返回201604.1
吗?
首先需要类似文档的内容:让我们从float and real (Transact-SQL)开始。首先,我们注意到:
real
的ISO同义词是float(24)
。
如果我们再往下看:
float [(n)]其中n是用于存储整数的位数 浮点数的尾数以科学计数法表示,因此, 决定精度和存储大小。如果指定了n,则必须为 一个介于1到53之间的值。n的默认值为53。n值
Precision Storage size
1-24 7 digits 4 bytes
因此,现在我们知道real
(又称float(24)
)的精度为7。201604.125
的精度为9,即2太多了。所以返回值是2和5。
现在,ROUND (Transact-SQL)。声明:
返回一个数值,四舍五入到指定的长度或精度。
使用real
/ float
时,这些数字实际上并没有因为浮点而丢失。当您使用ROUND
时,您特别指出“我想要这么多小数位”。这就是为什么您随后可以看到.13
和.125
的原因,正如您特别要求的那样。当您刚刚返回值@number
时,由于它是real
,它的精度为7,所以返回值201604.1
。