sql-server - SQL Server Float 数据类型计算 vs decimal

标签 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

从上面的答案来看,第三个答案是正确的。这就是 float 据类型被称为近似数值数据类型的原因吗

或者我做错了什么根本性的事情。

顺便说一句,这是由于我在遗留系统中遇到的一个问题,其中我必须使用 float 作为存储数据类型,同时在计算时不应该丢失精度。

请提出替代方案或解释。

最佳答案

float 精确到15 significant figures仅(在 SQL Server 中)。

1.52415693411713 E+17 证明了这一点,其中 1.52415693411713(15 位数字)与您得到的一样准确。 152415693411713 后的最后 020... STRma​​ke up浮点分辨率

为保持精度,请勿使用 float 。就这么简单。如果你想进行计算,则 CAST 为十进制,但如果你 CAST 回 float ,则限制为 15 位

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

关于sql-server - SQL Server Float 数据类型计算 vs decimal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8414561/

相关文章:

计算最接近的浮点值

c# - Visual C# SQL 语句不会插入到数据库中

sql-server-2005 - 从 'Y' 或 'N' 转换为位

sql - 如何比较 SQL Server 中的两列

c++ - 在文件可移植性问题中存储 32 位 float

python - 是否有可能在 python 中找到 [a,b] 范围内的随机 float ?

sql - 如果其他列为空,则选择一列

sql-server - sql server 和统计配置文件

sql-server - 将 select 语句的结果保存到宽表 SQL Server

sql-server - SQL Server WHERE 子句中的与号 (&) 运算符