将 DOUBLE PRECISION 转换为 VARCHAR 后出现尾随零
Trailing zeros appears after casting DOUBLE PRECISION to VARCHAR
尝试将 DOUBLE PRECISION
值转换为 VARCHAR
时,我得到了一系列 12 个不需要的尾随零。
例如:
SELECT CAST(CAST(2500 AS DOUBLE PRECISION) AS VARCHAR(50))
FROM rdb$database
它会产生以下意想不到的结果:
2500.000000000000
预期结果:
2500
是什么导致了这个问题,如何避免?
此问题的直接解决方法是使用
trim(trailing '.' from trim(trailing '0' from stringvalue))
您可以将其包装在 PSQL 函数中以便于重用。
但是,这是一个有风险的解决方案,因为非常大或非常小的数字将以科学记数法呈现,并且此解决方案会从指数中去除零。例如,作为字符串的值 1.2e30
将呈现为 1.200000000000000e+30
,但上述解决方案会将其分解为 1.200000000000000e+3
(即 1200)。
正如 Arioch 'The 已经在评论中建议的那样,这是一个在应用程序的表示层中更好解决的问题(然后它还可以考虑区域设置之类的东西来处理小数点分隔符、千位分隔符等) .
或者,您可以尝试寻找第三方 UDF 或 UDR(或自己构建一个),它们允许您使用所需的格式来格式化数字。
尝试将 DOUBLE PRECISION
值转换为 VARCHAR
时,我得到了一系列 12 个不需要的尾随零。
例如:
SELECT CAST(CAST(2500 AS DOUBLE PRECISION) AS VARCHAR(50))
FROM rdb$database
它会产生以下意想不到的结果:
2500.000000000000
预期结果:
2500
是什么导致了这个问题,如何避免?
此问题的直接解决方法是使用
trim(trailing '.' from trim(trailing '0' from stringvalue))
您可以将其包装在 PSQL 函数中以便于重用。
但是,这是一个有风险的解决方案,因为非常大或非常小的数字将以科学记数法呈现,并且此解决方案会从指数中去除零。例如,作为字符串的值 1.2e30
将呈现为 1.200000000000000e+30
,但上述解决方案会将其分解为 1.200000000000000e+3
(即 1200)。
正如 Arioch 'The 已经在评论中建议的那样,这是一个在应用程序的表示层中更好解决的问题(然后它还可以考虑区域设置之类的东西来处理小数点分隔符、千位分隔符等) .
或者,您可以尝试寻找第三方 UDF 或 UDR(或自己构建一个),它们允许您使用所需的格式来格式化数字。