sql 中的 concat 对浮点列进行四舍五入

use*_*682 0 sql sql-server

我需要在多个字段(文本和数字)之间连接,并且它必须准确。有些字段最初是数字(19,6),我需要它的小数点后只有 2 位数字。

我正在使用以下查询,如果我运行 no。1 我在 CONCAT_AMOUNT 中得到一个四舍五入的数字,如下所示:38156.738156.7,在 no 中得到。2 我猜对了 - 476.47476.47。

为什么会发生这种情况以及如何用最少的功能解决这个问题?

SELECT 
    38156.650000 AS AMOUNT, 
    CAST(38156.650000 as float), 
    CONCAT(cast(38156.650000 as float), 
           cast(38156.650000 as float)) AS CONCAT_AMOUNT

SELECT 
    467.47 AS AMOUNT, 
    CAST(467.47 as float), 
    CONCAT(cast(467.47 as float), 
           cast(467.47 as float)) AS CONCAT_AMOUNT
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 6

好的,SQL Server 在将浮点值转换为字符串时做了一些假设。这应该不足为奇。数据库无法打印出小数点后无限位数。

因此,有两个简单的选择:转换为十进制或使用str()

select concat(cast(38156.650000 as decimal(10, 2)) . . .
Run Code Online (Sandbox Code Playgroud)

或者

select concat(str(38156.650000, 10, 2) . . .
Run Code Online (Sandbox Code Playgroud)

注意:第一个版本是 SQL 标准,应该适用于任何数据库。