C# SqlServer无法将0.1精确存储在浮点字段中?

C# SqlServer无法将0.1精确存储在浮点字段中?,c#,.net,sql-server,floating-point,C#,.net,Sql Server,Floating Point,我正在将浮点字段读入C#双字段。DB值0.1被读取为0.1000000149011612。我觉得这很奇怪,因为这个问题的答案讨论了FLOAT使用8个字节,这对于0.1来说肯定足够了 SQL Server使用4字节或8字节来存储非十进制数据 浮点数 如果指定“浮点到浮点”范围内的实数或任何值, SQLServer在内部使用float。如果你使用了float或者其他什么 浮动到浮动的范围(限制),它使用浮动 否则称为双精度 我的表具有类型为FLOAT的字段,该字段由带有参数@Result FLOAT

我正在将浮点字段读入C#双字段。DB值0.1被读取为0.1000000149011612。我觉得这很奇怪,因为这个问题的答案讨论了
FLOAT
使用8个字节,这对于0.1来说肯定足够了

SQL Server使用4字节或8字节来存储非十进制数据 浮点数

如果指定“浮点到浮点”范围内的实数或任何值, SQLServer在内部使用float。如果你使用了float或者其他什么 浮动到浮动的范围(限制),它使用浮动 否则称为双精度

我的表具有类型为
FLOAT
的字段,该字段由带有参数
@Result FLOAT OUT
的存储过程读取和返回

我的C代码如下所示,注意它使用的是
Float
类型而不是
Real

//setting up the query
command.Parameters.Add("@Result", SqlDbType.Float).Direction = ParameterDirection.Output;

//reading the value
double result = Convert.ToDouble(command.Parameters["@Result"].Value);

如果这能起作用。。。或者SqlServer FLOAT的工作方式是否与C#等语言中的普通
double
类型不同?是否应准确存储和返回0.1?如果我使用的是
Real
,我不会感到惊讶,但我认为
Float
应该非常准确。或者至少精度有限,不会引入错误的数字

运行此查询并注意它会创建一个无休止的while循环。您必须手动停止执行

 DECLARE @Counter float; 
 SET @Counter = 0; 
 WHILE (@Counter <> 1.0) BEGIN 
    SET @Counter += 0.1; 
    PRINT @Counter; 
 END; 
DECLARE@Counter float;
设置@Counter=0;
当(@Counter 1.0)开始时
设置@Counter+=0.1;
打印@计数器;
结束;
你可能会认为它和这个一样,但事实并非如此

DECLARE @Counter decimal(4,2); 
SET @Counter = 0; 
WHILE (@Counter <> 1.0) BEGIN 
  SET @Counter += 0.1; 
  PRINT @Counter; 
END;
DECLARE@计数器十进制数(4,2);
设置@Counter=0;
当(@Counter 1.0)开始时
设置@Counter+=0.1;
打印@计数器;
结束;
问题在于0.1不能准确存储在浮点数据类型中。需要使用十进制数据类型

十进制数据类型是精确的数字数据类型,其中float是近似的数字数据类型。这里有一个参考


使用float数据类型的查询产生无休止的while循环的原因是,近似数字数据类型永远不会等于1.0。

否。float是近似数据类型,并不完全准确。嗯,浮点的默认值是53,它的精度是15位,尽管这里有更多的数字。但我只会使用十进制(长度、精度)@SeanLange当然,没有fp表示法可以完全准确。但是使用C#double类型时,我通常不会看到这样的错误。Net和SqlServer表示浮点数的方式有什么不同吗?@pmbAustin:如果是这样的话,我会非常惊讶。我希望在这两种情况下都是IEEE-754。你检查过你所在领域的精度了吗?值0.1000000149011919384765625是0.1f的精确值,例如。。。所以听起来好像你有一个有效的浮动(24)字段。如果不调用
Convert.ToDouble
,会发生什么?
命令.Parameters[“@Result”].Value的执行时间类型是什么?最好解释一下为什么
float
版本是一个无止境的循环,而不是
十进制版本。关于它们为何不同的困惑在于这个问题(以及其他许多问题)的存在。krillgar,更新了我的答案。十进制浮点类型本质上并不比二进制浮点类型更精确。它们的不同之处仅仅在于使用该类型可以准确地存储数字。有些数字,如(1/3),不能以二进制或十进制浮点格式精确表示。