我对以下结果非常困惑:
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 :(得分: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中使用十进制或数字