SQL Server Float的文档说
使用的近似数字类型 使用浮点数字数据。 浮点数据是近似值; 因此,并非数据中的所有值 类型范围可以准确表示。
这就是我所期望的。如果是这种情况,为什么以下在SQL Server中返回“是”(意外)
DECLARE @D float
DECLARE @E float
set @D = 0.1
set @E = 0.5
IF ((@D + @D + @D + @D +@D) = @E)
BEGIN
PRINT 'YES'
END
ELSE
BEGIN
PRINT 'NO'
END
但等效的C ++程序返回“No”(预期为0.1不能精确表示,但0.5可以)
#include <iostream>
using namespace std;
int main()
{
float d = 0.1F;
float e = 0.5F;
if((d+d+d+d+d) == e)
{
cout << "Yes";
}
else
{
cout << "No";
}
}
答案 0 :(得分:8)
这可能是由不同的舍入策略,应用操作数的顺序,中间结果的存储方式等等引起的。有关详细信息,请参阅What Every Computer Scientist Should Know About Floating-Point Arithmetic。如果您不完全确定自己知道自己在做什么,则应避免在浮点数计算中进行相等比较。
答案 1 :(得分:0)
我想添加technet.microsoft.com - Using decimal, float, and real Data
中的一些引号,而不是添加新的答案避免在WHERE子句搜索条件中使用float或real列,尤其是=和&lt;&gt;运营商。最好将浮点数和实数列限制为&gt;或者&lt;比较。
另外,如您所知,目的如下:
float和real数据类型称为近似数据类型。 float和real的行为遵循IEEE 754关于近似数值数据类型的规范。
IEEE 754规范提供了四种舍入模式:舍入到最近,向上舍入,向下舍入和舍入到零。 Microsoft SQL Server使用向上舍入。
关于小数和数字
当必须严格按照指定存储数据值时,使用十进制数据类型存储带小数的数字。 在Transact-SQL中,numeric在功能上等效于十进制数据类型。