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

问题描述 投票:2回答:4

在以下查询中

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))...

sql-server tsql floating-point decimal floating-accuracy
4个回答
6
投票

浮点数仅对15 significant figures准确(在SQL Server中)。


0
投票

最后的答案


0
投票

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.