【问题标题】:Smart CONVERT float to VARCHAR in T-SQLT-SQL 中的智能 CONVERT 浮点数到 VARCHAR
【发布时间】:2016-02-18 10:00:23
【问题描述】:

我有以下代码

DECLARE @m FLOAT=213456789.55
DECLARE @sql VARCHAR(MAX)='INSERT INTO Test VALUES('+CONVERT(VARCHAR,@m,1)+')'
EXEC(@sql)

但结果是213456790 而不是213456789.55

当我尝试写 CONVERT(VARCHAR,213456789.55,1) 时,它会返回 213456789.55 而不是 213456790

我该如何解决这个问题?

编辑

DECLARE @m DECIMAL(18,2)=213456789.55 一样将@m 声明为十进制解决了这个问题,但我想知道是否有另一种使用浮点数的解决方案。谢谢

【问题讨论】:

  • CONVERT(VARCHAR(100), @m) 应该这样做。
  • 试过没有成功!它不会改变任何东西

标签: sql sql-server tsql varcharmax


【解决方案1】:

您可以使用STR 代替CONVERTSTR 允许指定小数点右边的小数位数。

DECLARE @m FLOAT=213456789.55;
SELECT 
@m AS [Float]
,CONVERT(VARCHAR(100),@m,0) AS Convert0
,CONVERT(VARCHAR(100),@m,1) AS Convert1
,CONVERT(VARCHAR(100),@m,2) AS Convert2
,LTRIM(STR(@m, 20, 2)) AS [Str]

结果(SQL Server 2008)

+--------------+--------------+----------------+------------------------+--------------+
|    Float     |   Convert0   |    Convert1    |        Convert2        |     Str      |
+--------------+--------------+----------------+------------------------+--------------+
| 213456789.55 | 2.13457e+008 | 2.1345679e+008 | 2.134567895500000e+008 | 213456789.55 |
+--------------+--------------+----------------+------------------------+--------------+

CONVERT 始终对float 类型使用科学记数法。

【讨论】:

  • 谢谢它的工作!除非@m =12456354213456789.55;
  • float 的精度为 15 位。因此,当您将 12456354213456789.55 分配给 float 变量时,该值会四舍五入。如果您需要超过 15 位的精度,则必须使用 decimal
【解决方案2】:

试试这个:

DECLARE @m FLOAT=213456789.55
DECLARE @sql VARCHAR(MAX)='INSERT INTO Test VALUES('+CONVERT(VARCHAR,CAST(@m AS MONEY),1)+')'
EXEC(@sql)

【讨论】:

  • 感谢您的回答、时间和精力,但是虽然这可行,但将float 类型更改为money 并不是一个好主意。目标不是更改数据类型(varchar 除外)
猜你喜欢
  • 2013-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-28
  • 1970-01-01
  • 2014-04-16
  • 1970-01-01
  • 2022-01-17
相关资源
最近更新 更多