在以下查询中
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作为存储数据类型,同时计算时不应该丢失精度。请提供替代方案或解释。
答案 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值的相同运算更精确。