SQL Server自动舍入?

时间:2009-06-12 15:18:46

标签: sql sql-server rounding

我对以下结果非常困惑:

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 ......

6 个答案:

答案 0 :(得分:7)

我认为你对PRINT使用STR函数的默认设置隐式将数字转换为字符这一事实感到困惑 - 长度为10(参见MSDN) 。试试PRINT STR(@wth, 20, 16),你可能会更开心。

答案 1 :(得分:4)

分歧不是四舍五入。 PRINT正在四舍五入。

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

答案 2 :(得分:3)

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

尝试使用小数代替:

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

给我结果:

0.0174532925199433

马克

答案 3 :(得分:1)

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

  

在Transact-SQL语句中,一个常量   带小数点是自动的   转换为数字数据值,   使用最小精度和比例   必要。例如,常数   12.345被转换为精度为5和a的数值   规模为3。

因此,以下内容更能代表SQL Server隐式执行的操作:

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

答案 4 :(得分:1)

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

Float仅解析为15位有效数字。你有17所以它不能漂浮。由于datatype precedence以及输出比例和精度is based on these rules

,180通过隐式转换变为十进制

输出0.01745329251994329500也有17个sig figs。它必须是小数。

现在,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

答案 5 :(得分:0)

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

我想说C#double是C#中唯一足以存储SQL float的浮点数据类型。

示例:

C#Double = 8字节 Sql Float = 4个字节

您的问题的简单方法是在SQL中使用十进制或数字