仅针对Real列的MSSQL数据库中Round函数的怪异行为

时间:2018-09-05 07:49:10

标签: sql-server tsql azure-sql-database

在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

实际列类型的输出 enter image description here

1 个答案:

答案 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