在没有科学计数法的 SQL Server 中将 float 转换为 varchar

Posted

技术标签:

【中文标题】在没有科学计数法的 SQL Server 中将 float 转换为 varchar【英文标题】:Convert float into varchar in SQL Server without scientific notation 【发布时间】:2011-06-29 13:24:09 【问题描述】:

在 SQL Server 中将 float 转换为 varchar,无需科学记数法和修剪小数。

例如:

我有浮点值1000.2324422,然后它会被转换成varchar,和1000.2324422一样。

可能有任意数量的十进制值...浮点值随机出现。

【问题讨论】:

Why casting from float to varchar is being rounded in SQL Server的可能重复 【参考方案1】:

转换或转换为VARCHAR(MAX) 或其他任何 对我使用大整数(在浮点字段中)如 167382981(总是出现'1.67383e+008')工作的方法。

做了工作的是STR()

【讨论】:

这更好,但实际上我必须执行 LTRIM(STR(someField)),因为默认情况下它会返回一个 VARCHAR(10),如果数字没有 10 位,则用空格填充 由于某种原因,在 sql 2008 r2 上,当我在 12 位数字值上使用 STR() 时,我得到了 ******* 值。我不得不改用@Chris 的方法 这不适用于负值。因为我只处理整数,所以我能够使用 CAST(CAST([value] as INT)AS NVARCHAR(10))【参考方案2】:

str()cast(float as nvarchar(18)) 都不适合我。

最终的工作是转换为 int,然后转换为 nvarchar,如下所示:

 convert(nvarchar(18),convert(bigint,float))

【讨论】:

cast(cast(fieldname as bigint) as nvarchar(18)) 也是一个选项。 转换为 Int 会很快让你陷入溢出,如上所述,bigint 更好! @JPHellemons 非常感谢,这节省了我完成工作的时间! 你传递了一个浮点数(就像提问者问的那样),但这仅适用于整数。 JP Hellemons 你的演员阵容为我工作。【参考方案3】:

STR 功能很好用。在进行了一些计算后,我得到了一个浮点数,需要更改为 VARCHAR,但我也随机获得了科学记数法。经过所有的计算,我做了这个转换:

 ltrim(rtrim(str(someField)))

【讨论】:

这很有帮助。另外,请注意 str 的默认长度为 10。因此,如果您分配给小于此长度的固定长度 varchar,它将被截断。例如:声明@x varchar(9) = str(1);将分配 9 个空格给 @x 我将我的字段包含在 str(field) 中,并且一切正常。谢谢:) 是的,我使用相同的解决方案,但我也指定精度,如这篇文章:***.com/questions/3715675/… 对我来说,str 适用于整数值,但它会将非整数值四舍五入到最接近的 int。所以str(0.2) 返回0。这在 MSSQL 2008 R2 上。【参考方案4】:

试试CAST(CAST(@value AS bigint) AS varchar)

【讨论】:

但这仅适用于整数,而提问者询问浮点数。【参考方案5】:

这行得通:

CONVERT(VARCHAR(100), CONVERT(DECIMAL(30, 15), fieldname))

【讨论】:

【参考方案6】:

由于小数的原因,这与此特定情况无关,但可能会对搜索标题的人有所帮助。 整数字段可以很好地转换为 varchars,但浮点数会转换为科学记数法。因此,如果您没有小数,快速更改浮点数的一种非常快速的方法是先将字段更改为整数,然后将其更改为 varchar。

【讨论】:

你能举个例子吗?【参考方案7】:

试试这个:

SELECT REPLACE(RTRIM(REPLACE(REPLACE(RTRIM(REPLACE(CAST(CAST(YOUR_FLOAT_COLUMN_NAME AS DECIMAL(18,9)) AS VARCHAR(20)),'0',' ')),' ','0'),'.',' ')),' ','.') FROM YOUR_TABLE_NAME
    转换为 DECIMAL 将在每个值上加上小数点,无论是 之前有没有。 转换为 VARCHAR 允许您使用 REPLACE 函数 首先用空格替换零,然后用 RTRIM 删除所有尾随空格(以前的零),然后用零替换剩余的空格。 然后对句点执行相同操作,以消除没有小数值的数字。

【讨论】:

太棒了!这是我见过的唯一能正确处理非整数值的解决方案,并且不会用前导或尾随零或空格来破坏结果。我创建了一个用户定义的函数来做到这一点。我应该编辑答案以将其作为函数定义给出吗?【参考方案8】:

下面是一个例子,我们可以在没有任何科学记数法的情况下转换浮点值。

DECLARE @Floater AS FLOAT = 100000003.141592653

SELECT CAST(ROUND(@Floater, 0) AS VARCHAR(30))
      ,CONVERT(VARCHAR(100), ROUND(@Floater, 0))
      ,STR(@Floater)
      ,LEFT(FORMAT(@Floater, ''), CHARINDEX('.', FORMAT(@Floater, '')) - 1)

SET @Floater = @Floater * 10

SELECT CAST(ROUND(@Floater, 0) AS VARCHAR(30))
      ,CONVERT(VARCHAR(100), ROUND(@Floater, 0))
      ,STR(@Floater)
      ,LEFT(FORMAT(@Floater, ''), CHARINDEX('.', FORMAT(@Floater, '')) - 1)

SET @Floater = @Floater * 100

SELECT CAST(ROUND(@Floater, 0) AS VARCHAR(30))
      ,CONVERT(VARCHAR(100), ROUND(@Floater, 0))
      ,STR(@Floater)
      ,LEFT(FORMAT(@Floater, ''), CHARINDEX('.', FORMAT(@Floater, '')) - 1)

SELECT LEFT(FORMAT(@Floater, ''), CHARINDEX('.', FORMAT(@Floater, '')) - 1)
      ,FORMAT(@Floater, '')

在上面的例子中,我们可以看到格式化函数对我们很有用。 FORMAT() 函数总是返回 nvarchar。

【讨论】:

【参考方案9】:

我有另一个解决方案,因为 STR() 函数会产生一些空格,所以我使用 FORMAT() 函数作为以下示例:

SELECT ':' + STR(1000.2324422), ':' + FORMAT(1000.2324422,'##.#######'), ':' + FORMAT(1000.2324422,'##')

以上代码的结果是:

:      1000 :1000.2324422   :1000

【讨论】:

【参考方案10】:

您可以使用此代码:

STR(<Your Field>, Length, Scale)

您的字段 = 用于转换的浮动字段

长度 = 带小数点的浮点数的总长度

比例 = 小数点后的长度数

例如:

SELECT STR(1234.5678912,8,3)

结果是:1234.568

请注意,最后一位数字也是向上取整的。

【讨论】:

【参考方案11】:

您必须非常好地测试您的数据。这可能会变得混乱。这是一个简单地将值乘以 10 的结果示例。运行它来看看会发生什么。 在我的 SQL Server 2017 机器上,在第三个查询中,我得到了一堆 *********。如果您 CAST as BIGINT 它应该每次都有效。但是,如果您不测试并且没有测试足够的数据,您以后可能会遇到问题,所以不要误以为它会对您的所有数据都有效,除非您测试最大预期值。

 Declare @Floater AS FLOAT =100000003.141592653
    SELECT CAST(ROUND(@Floater,0) AS VARCHAR(30) ), 
            CONVERT(VARCHAR(100),ROUND(@Floater,0)), 
            STR(@Floater)

    SET  @Floater =@Floater *10
    SELECT CAST(ROUND(@Floater,0) AS VARCHAR(30) ), 
            CONVERT(VARCHAR(100),ROUND(@Floater,0)), 
            STR(@Floater)

    SET  @Floater =@Floater *100
    SELECT CAST(ROUND(@Floater,0) AS VARCHAR(30) ), 
            CONVERT(VARCHAR(100),ROUND(@Floater,0)), 
            STR(@Floater)

【讨论】:

你能比“这会变得一团糟”“遇到问题”更具体吗?究竟会发生什么?示例的结果是什么?请通过editing (changing) your answer 回复,而不是在 cmets 中(without "Edit:"、"Update:" 或类似的 - 答案应该看起来像是今天写的)。【参考方案12】:

有很多答案,但没有一个足够完整,无法适应将FLOAT 转换为NVARCHAR 的场景,所以我们来了。

这就是我们最终的结果:

DECLARE @f1 FLOAT = 4000000
DECLARE @f2 FLOAT = 4000000.43

SELECT TRIM('.' FROM TRIM(' 0' FROM STR(@f1, 30, 2))),
       TRIM('.' FROM TRIM(' 0' FROM STR(@f2, 30, 2)))
SELECT CAST(@f1 AS NVARCHAR),
       CAST(@f2 AS NVARCHAR)

输出:

------------------------------ ------------------------------
4000000                        4000000.43

(1 row affected)

                               
------------------------------ ------------------------------
4e+006                         4e+006

(1 row affected)

在我们的场景中,FLOAT 是一美元到小数点后 2 位就足够了,但您可以根据需要轻松增加它。 此外,我们需要为整数修剪“.00”。

【讨论】:

【参考方案13】:

试试这个代码

SELECT CONVERT(varchar(max), CAST(1000.2324422 AS decimal(11,2)))

结果:

1000.23

这里decimal(11,2):11位总位数(不带小数点),2 - 小数点后两位

【讨论】:

【参考方案14】:

我之前的答案都没有。最后我只是简单地使用了这个:

INSERT INTO [Destination_Table_Name]([Field_Name])
SELECT CONCAT('#',CAST([Field_Name] AS decimal(38,0))) [Field_Name]
FROM [dbo].[Source_Table_Name] WHERE ISNUMERIC([CIRCUIT_NUMBER]) = 1

INSERT INTO [Destination_Table_Name]([Field_Name])
SELECT [Field_Name]
FROM [dbo].[Source_Table_Name] WHERE ISNUMERIC([CIRCUIT_NUMBER]) <> 1

【讨论】:

感谢您提供答案。您能否编辑您的答案以包括对您的代码的解释?这将有助于未来的读者更好地了解正在发生的事情,尤其是那些刚接触该语言并难以理解概念的社区成员。 另外,作为其中的一部分,可能值得指出为什么其他答案不起作用。它们是否有特别的问题,例如语法或逻辑错误?这对于与投票最多的答案进行对比特别有用。【参考方案15】:
select format(convert(float,@your_column),'0.0#########')

优点:此方案独立于源数据类型(floatscientificvarchardate、等等)

String 限制为 10 位,bigInt 去掉了十进制值。

【讨论】:

【参考方案16】:

这行得通:

假设

dbo.AsDesignedBites.XN1E1 = 4016519.564`

对于以下字符串:

'POLYGON(('+STR(dbo.AsDesignedBites.XN1E1, 11, 3)+'...

【讨论】:

以上是关于在没有科学计数法的 SQL Server 中将 float 转换为 varchar的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2008 - 从 Float 将列更改为 Varchar 产生科学记数法

Python中将array类型不按科学计数法存在文件中的方法

如何把SQL server 表里插入转换科学计数法的方法。

SQL Server中如何把 科学记数法字符串 变为 数字字符串

SQL Server:将FLOAT转换为NVARCHAR,最高精度,无需科学记数法

如何在 SQL 中将指数和系数转换为整数值