避免浮点 SQL 的转换过程中的精度损失

Avoid precision loss in Convert process for float SQL

提问人:Rocky3151 提问时间:11/27/2020 最后编辑:Dale KRocky3151 更新时间:11/27/2020 访问量:481

问:

我正在尝试在转换和合并 SQL 查询coalesced_field_value列中保留浮点值。我做不到。

我想要原样的值,没有多余的零的 0

在这里非常感谢任何帮助。

drop table #source
create table #source
(
    userid int NULL,
    fieldid int NULL,
    col1date date NULL,
    col3float float NULL,
    col3string nvarchar(4000) NULL,
)

insert into #source  
values (1,1,NULL,'1.3456786',NULL),
(1,1,NULL,'1.3456786789',NULL),
(1,2,'2020-01-01',NULL,NULL),
(2,1,NULL,NULL,'test')

select * from #source

select *,
    COALESCE(col3string, 
    CONVERT(nvarchar(4000), col1date),
    CONVERT(nvarchar(4000),  CAST(col3float AS decimal(18,14))))
    AS coalesced_field_value
FROM #source

userid  fieldid col1date      col3float         col3string   coalesced_field_value
1         1     NULL          1.3456786         NULL         1.34567860000000
1         1     NULL          1.3456786789      NULL         1.34567867890000
1         2     2020-01-01    NULL              NULL         2020-01-01
2         1     NULL          NULL              test         test
SQL 服务器 浮点 精度

评论

0赞 Dale K 11/27/2020
为什么要将其转换为 SQL Server 中的字符串?这是一项前端/格式化工作。你似乎没有像你的问题标题所说的那样失去任何精确度吗?
0赞 Rocky3151 11/27/2020
@DaleK这是为了在数据库中的表之间同步。我希望coalesced_field_value与col3float值相同。它增加了额外的 0

答:

1赞 Ockert 11/27/2020 #1

调用 CONVERT 时会添加尾随零,因为您没有将第三个参数传递给 CONVERT,而是使用其默认样式在 DECIMAL 和 VARCHAR 之间进行转换。

CONVERT 没有您正在寻找的特定样式,因此请使用 FORMAT 强制转换值,这样您就可以直接控制样式字符串

SELECT *,
       COALESCE(col3string, 
       CONVERT(NVARCHAR(4000), col1date),
       FORMAT(col3float,'0.####################')) AS coalesced_field_value
FROM #source