2009-06-12 49 views
2

我很迷茫通过了如下结果:SQL Server自动舍入?

PRINT 3.1415926535897931 /180 

控制台结果= 0.01745329251994329500

DECLARE @whatTheHell float(53) 
SET @whatTheHell = 3.1415926535897931/180 
PRINT @whatTheHell 

控制台结果= 0.0174533

我不明白,因为提到这一点:

http://msdn.microsoft.com/en-us/library/ms131092.aspx

Sql Server Float应该相当于c#double。 但是当我计算这在C#:

double hellYeah = 3.1415926535897931 /180; 

我得到0.017453292519943295 ...

+0

好的变量名称。 +1 – 2014-03-21 03:13:02

回答

7

我认为你得到的事实,PRINT隐式转换数字与为STR功能的默认设置字符困惑 - 长度为10(见MSDN)。试试PRINT STR(@wth, 20, 16),你可能会更开心。

3

我猜“浮动式”只是对精度的限制。联机丛书用FLOAT(53)说你应该得到15位精度 - 不确定这些数字是否在小数分隔符之前或之后有固有的限制。

尝试使用十进制来代替:

DECLARE @whatTheHell2 decimal(18,16) 
SET @whatTheHell2 = 3.1415926535897931/180 
PRINT @whatTheHell2 

给我的结果:

0.0174532925199433 

马克

+0

但是当你阅读这个msdn文档时: http://msdn.microsoft.com/en-us/library/ms131092.aspx 你会发现sql float精度等价于c#双精度。 或者当我用c#计算这个值时: double pipo = 3.1415926535897931/180; 我得到:0.017453292519943295 ??? – Roubachof 2009-06-12 15:30:35

+0

我知道 - 这也让我感到困惑 - 请参阅其他答案以获取更多信息。似乎SQL服务器为FLOAT假定某种默认精度 - 使用NUMERIC或DECIMAL而不是显式精度设置 – 2009-06-12 15:50:15

+1

Alex Martelli和David B.是对的! – Roubachof 2009-06-12 15:58:26

1

从SQL Server 2005联机丛书Data Type Conversion话题:

在Transact-SQL语句,一个consta nt 带小数点时自动将 转换为数值数据值, 使用最小精度和 必要的比例。例如,恒 12.345转换成数值为5的精度和 规模的3

所以,以下是比较有代表性的是什么的SQL Server的隐式地做:

DECLARE @whatTheHell NUMERIC(21, 20) 
SET @whatTheHell = 3.1415926535897931/180 
PRINT @whatTheHell 
+0

指的是http://msdn.microsoft.com/en-us/library/ms173773.aspx,float(53)应具有15位数的精度。就像c#double一样:c#结果确实有15位数字。所以我真的不明白为什么我最终的精确度是6位数的浮点数(53)...... – Roubachof 2009-06-12 15:44:34

4

鸿沟不是四舍五入的。打印四舍五入。

DECLARE 
    @var1 float, 
    @var2 float, 
    @var3 float 

SET @var1 = 3.1415926535897931 
SET @var2 = 180 

SET @var3 = @var1/@var2 
SELECT @var1/@var2 as Computed, @var3 as FromVariable 

PRINT @var1/@var2 
PRINT @var3 
0

当你说SQL float映射到C#double时,我认为你假设SQL float字节大小与C#双字节大小相同。

我会说C#double是C#中存储SQL浮点的唯一足够大的浮点数据类型。

实施例:

C#双人= 8字节 的Sql浮法= 4个字节

的简单的办法解决您的问题是使用十进制或数字在SQL

1

PRINT 3.1415926535897931 /180正被评估为十进制。

浮点数只能解析为15位有效数字。你有17个,所以它不能浮动。 180通过由于datatype precedence隐式转换和输出标度和精度is based on these rules

输出0.01745329251994329500具有17个SIG无花果太变为小数。它必须是十进制的。

现在,SET @whatTheHell = 3.1415926535897931/180。浮点数转换作为赋值运算符的一部分进行。在此之前,它也是右侧的小数。浮法是近似的,它是四舍五入的。

在C#中它的所有双打,因为你没有固定

相关问题(除非你告诉编译器):

Choosing the appropriate precision for decimal(x,y)

In SQL how can I convert a money datatype to a decimal?

SQL Server, where clauses comparisons with different types & default casting behaviour