2

我对以下结果感到非常困惑:

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

4

6 回答 6

7

PRINT我认为您对使用函数的默认设置隐式地将数字转换为字符的事实感到困惑STR——长度为 10(请参阅MSDN)。尝试一下PRINT STR(@wth, 20, 16),你可能会更快乐。

于 2009-06-12T15:50:27.143 回答
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
于 2009-06-12T15:43:34.740 回答
3

我猜“FLOAT”类型只是对精度有限制。Books Online 说使用 FLOAT(53) 你应该得到高达 15 位的精度 - 不确定这些数字是在小数点分隔符之前还是之后是否存在固有限制。

尝试使用十进制代替:

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

给我结果:

0.0174532925199433

马克

于 2009-06-12T15:26:37.997 回答
1

从 SQL Server 2005 联机丛书数据类型转换主题:

在 Transact-SQL 语句中,带小数点的常量会自动转换为数值数据值,使用所需的最小精度和小数位数。例如,常数 12.345 被转换为精度为 5、小数位数为 3 的数值。

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

DECLARE @whatTheHell NUMERIC(21, 20)
SET @whatTheHell = 3.1415926535897931 / 180
PRINT @whatTheHell
于 2009-06-12T15:29:31.170 回答
1

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

浮点数仅解析为 15 位有效数字。你有 17 所以它不能浮动。由于数据类型优先,180 通过隐式转换变为十进制,输出比例和精度基于这些规则

输出 0.01745329251994329500 也有 17 个 sig figs。它必须是十进制。

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

在 c# 中,这都是双打,因为你没有固定点(除非你告诉编译器?)

相关问题:

为小数(x,y)选择适当的精度

在 SQL 中,如何将货币数据类型转换为小数?

SQL Server,where子句与不同类型和默认转换行为的比较

于 2009-06-12T19:41:46.867 回答
0

当您说 SQL 浮点映射到 C# 双精度时,我认为您假设 SQL 浮点字节大小与 C# 双字节大小相同。

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

例子:

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

解决问题的简单方法是在 SQL 中使用小数或数字

于 2009-06-12T15:53:45.950 回答