在以下查询中
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
根据以上答案,第三个答案是正确的。这就是为什么将float数据类型称为“近似数值数据类型”的原因]
或者我是从根本上做错了。
顺便说一句,这是我遗留系统中的一个问题,在该系统中,我必须使用float作为存储数据类型,同时在计算时不应失去精度。
请提出替代方案或说明。
在以下查询中,声明@a float(23)声明@b float(23)声明@c float(53)设置@a = 123456789012.1234设置@b = 1234567.12345678设置@c = @a * @b选择@c选择LTRIM(STR((@ c),32,12))...
浮点数仅对15 significant figures准确(在SQL Server中)。
最后的答案
不是浮点数据类型的问题。问题是使用float(23)。该数据类型可以容纳8个有效数字,而不是15(浮点数(53))。这就是您在输出中获得的正确位数。
始终检查实际分配给变量的值是什么: