SQL Server Float数据类型计算与十进制

时间:2011-12-07 11:28:49

标签: sql-server tsql floating-point decimal floating-accuracy

在以下查询中

declare @a float(23)
declare @b float(23)
declare @c float(53)
set @a = 123456789012.1234
set @b = 1234567.12345678
set @c = @a * @b
select @c

select LTRIM(STR((@c),32,12))

declare @x  decimal(16,4)
declare @y decimal(16,8)
declare @z decimal (32,12)

set @x = 123456789012.1234
set @y = 1234567.12345678
set @z = @x * @y
select @z

我得到了答案

1.52415693411713E+17
152415693411713020.000000000000
152415692881907790.143935926652

从上面的答案中,第三个答案是正确答案。这就是浮点数据类型称为近似数值数据类型

的原因

或者我做了一些根本错误的事情。

BTW这是由于遗留系统存在问题,我必须使用float作为存储数据类型,同时计算时不应该丢失精度。

请提供替代方案或解释。

4 个答案:

答案 0 :(得分:6)

Float仅适用于15 significant figures(在SQL Server中)。

1.52415693411713 E+17证明了这一点,其中1.52415693411713(15位数)与您获得的一样准确。 020...152415693411713 STR之后的最终{{1}} 组成 浮点分辨率 < / p>

为了保持精确,请不要使用浮点数。就这么简单。如果要计算,则CAST为十进制,但如果您将CAST重新设置为浮动,则 限制为15位数

请参阅"What Every Computer Scientist Should Know About Floating-Point Arithmetic"

答案 1 :(得分:0)

最后的答案

152415692881907790.143935926652

提供最多12位小数,因为你已经相应地声明了@z。

declare @z decimal (32,12)

此声明中的第二个参数是scale,设置为12。

有关详细信息,请访问http://msdn.microsoft.com/en-us/library/ms187746.aspx

答案 2 :(得分:0)

问题不是浮点数据类型。 问题是使用float(23)。 该数据类型可以容纳8个有效数字,而不是15(浮点数(53))。 这就是您在输出中获得的正确位数。

以float(23)精度完成2个float(23)数的计算,然后才转换为float(53),这绝对是无用的并且具有误导性。

修复@a和@b的初始声明,问题将消失。

答案 3 :(得分:0)

始终检查实际分配给变量的值是什么

declare @a float(23)
declare @b float(23)
declare @c float(23)

set @a = 123456789012.1234
set @b = 1234567.12345678
SET @c = @a * @b 

select @a, @b, @c

GO 

declare @a float
declare @b float
declare @c float

set @a = 123456789012.1234
set @b = 1234567.12345678
SET @c = @a * @b 

select @a, @b, @c

GO 

The outputs of the SELECTs:

1.234568E+11    1234567     1.524157E+17

123456789012.123    1234567.12345678    1.52415692881908E+17

P.S。第二级(乘法,除法)和小数点上的运算使用浮点计算,因此,假设两种类型使用的深度相同,则它们的精度不能比对FLOAT值的相同运算更精确。