代码之家  ›  专栏  ›  技术社区  ›  hgulyan

如何在sqlserver中将float转换为varchar

  •  109
  • hgulyan  · 技术社区  · 14 年前

    我有一个具有不同长度的数字的float列,我正在尝试将它们转换为varchar。

    cast(cast(float_field as bigint) as varchar(100))
    

    CONVERT(varchar(100), Cast(float_field as decimal(38, 0)))
    

    感谢您的帮助。

    更新:

    样本值为 2.2000012092E+26号公路 .

    14 回复  |  直到 14 年前
        1
  •  259
  •   Michael Currie    7 年前

    尝试使用 STR() 功能。

    SELECT STR(float_field, 25, 5)
    

    STR() Function


    另一个注意事项:这个垫子在左边有空格。如果这是一个问题,结合 LTRIM

    SELECT LTRIM(STR(float_field, 25, 5))
    
        2
  •  43
  •   adinas    8 年前

    我找到的唯一一个返回与原始数字完全相同的查询位是

    CONVERT (VARCHAR(50), float_field,128)
    

    看到了吗 http://www.connectsql.com/2011/04/normal-0-microsoftinternetexplorer4.html

    上述其他解决方案有时会舍入或在末尾添加数字

    :根据下面的评论和我在 https://msdn.microsoft.com/en-us/library/ms187928.aspx

    CONVERT (VARCHAR(50), float_field,3)
    

    应在新的SQL Server版本中使用(Azure SQL数据库,从SQL Server 2016 RC3开始)

        3
  •  13
  •   molecular    8 年前

    这就是我在SQLServer2012中最终使用的解决方案(因为所有其他建议都有截断小数部分的缺点或其他一些缺点)。

    declare @float float = 1000000000.1234;
    select format(@float, N'#.##############################');
    

    输出:

    1000000000.1234
    

    这样做的另一个好处(在我的例子中)是简化和本地化:

    select format(@float, N'#,##0.##########', 'de-DE');
    

    输出:

    1.000.000.000,1234
    
        4
  •  3
  •   Axel    12 年前

    有用的话题谢谢。

    如果你想像我一样去掉零线,你可以用它:

    DECLARE @MyFloat [float];
    SET @MyFloat = 1000109360.050;
    SELECT REPLACE(RTRIM(REPLACE(REPLACE(RTRIM(LTRIM(REPLACE(STR(@MyFloat, 38, 16), '0', ' '))), ' ', '0'),'.',' ')),' ',',')
    
        5
  •  2
  •   devio    14 年前
        6
  •  2
  •   codingbadger    11 年前

    这不需要四舍五入就有帮助

    declare @test float(25)
    
    declare @test1 decimal(10,5)
    
    select @test = 34.0387597207
    select @test
    set @test1 = convert (decimal(10,5), @test)
    select cast((@test1) as varchar(12))
    
    
    Select  LEFT(cast((@test1) as varchar(12)),LEN(cast((@test1) as varchar(12)))-1)
    
        7
  •  2
  •   tbraun89    10 年前

    integer 先是变成一个 string

    cast((convert(int,b.tax_id)) as varchar(20))
    
        8
  •  2
  •   phd    7 年前

    cast((convert(bigint,b.tax_id)) as varchar(20))
    
        9
  •  2
  •   double-beep hudson solomon    4 年前
    SELECT LTRIM(STR(float_field, 25, 0))
    

    是最好的方法,所以你不添加 .0000 以及值末尾的任何数字。

        10
  •  1
  •   James L.    10 年前

    如果使用CLR函数,则可以将float转换为与float类似的字符串,而无需在末尾添加所有额外的0。

    CLR函数

    [Microsoft.SqlServer.Server.SqlFunction(DataAccess = DataAccessKind.Read)]
    [return: SqlFacet(MaxSize = 50)]
    public static SqlString float_to_str(double Value, int TruncAfter)
    {
      string rtn1 = Value.ToString("R");
      string rtn2 = Value.ToString("0." + new string('0', TruncAfter));
    
      if (rtn1.Length < rtn2.Length) { return rtn1; } else { return rtn2; }
    }
    

    例子

    create table #temp (value float)
    insert into #temp values (0.73), (0), (0.63921), (-0.70945), (0.28), (0.72000002861023), (3.7), (-0.01), (0.86), (0.55489), (0.439999997615814)
    
    select value,
           dbo.float_to_str(value, 18) as converted,
           case when value = cast(dbo.float_to_str(value, 18) as float) then 1 else 0 end as same
    from   #temp
    
    drop table #temp
    

    .

    输出

    value                  converted                  same
    ---------------------- -------------------------- -----------
    0.73                   0.73                       1
    0                      0                          1
    0.63921                0.63921                    1
    -0.70945               -0.70945                   1
    0.28                   0.28                       1
    0.72000002861023       0.72000002861023           1
    3.7                    3.7                        1
    -0.01                  -0.01                      1
    0.86                   0.86                       1
    0.55489                0.55489                    1
    0.439999997615814      0.439999997615814          1
    

    所有转换的字符串都被截断为18位小数,并且没有尾随的零。18位精度对我们来说不是问题。而且,我们100%的FP数(接近100000个值)看起来与字符串值相同,就像它们在数据库中与FP数一样。

        11
  •  0
  •   Anil Varghese    11 年前

    DECLARE @MyFloat [float];
    SET @MyFloat = 1000109360.050;
    
    SELECT REPLACE(RTRIM(REPLACE(REPLACE(RTRIM((REPLACE(CAST(CAST(@MyFloat AS DECIMAL(38,18)) AS VARCHAR(max)), '0', ' '))), ' ', '0'),'.',' ')),' ','.')
    
        12
  •  0
  •   Dinah SLaks    10 年前
    select replace(myFloat, '', '')
    

    REPLACE() documentation :


    如果任何一个参数为NULL,则返回NULL。

    测验:
    空==>[空]
    1.11==>1.11

    1.00==>1

    -1.10==>-1.1
    0.00001==>1e-005
    0.000011==>1.1e-005

        13
  •  0
  •   Eduardo    10 年前

    选择

        14
  •  0
  •   user8642458    7 年前

    根据分子生物学的答案:

    DECLARE @F FLOAT = 1000000000.1234;
    SELECT @F AS Original, CAST(FORMAT(@F, N'#.##############################') AS VARCHAR) AS Formatted;
    
    SET @F = 823399066925.049
    SELECT @F AS Original, CAST(@F AS VARCHAR) AS Formatted
    UNION ALL SELECT @F AS Original, CONVERT(VARCHAR(128), @F, 128) AS Formatted
    UNION ALL SELECT @F AS Original, CAST(FORMAT(@F, N'G') AS VARCHAR) AS Formatted;
    
    SET @F = 0.502184537571209
    SELECT @F AS Original, CAST(@F AS VARCHAR) AS Formatted
    UNION ALL SELECT @F AS Original, CONVERT(VARCHAR(128), @F, 128) AS Formatted
    UNION ALL SELECT @F AS Original, CAST(FORMAT(@F, N'G') AS VARCHAR) AS Formatted;
    
        15
  •  0
  •   Andrew    6 年前

    我刚刚遇到了类似的情况,并对ssmsv17.9.1/sql2017中出现的“非常大的数字”的舍入问题感到惊讶。

    我并不是说我有一个解决方案,但是我观察到了 FORMAT 礼物 一个看起来正确的数字。我不能暗示这会减少进一步的舍入问题,或者在复杂的数学函数中是有用的。

    提供的SQL代码 应该 清楚地展示我的观察结果,同时允许其他人在需要时测试他们的代码和想法。

    WITH Units AS 
    (
       SELECT 1.0 AS [RaisedPower] , 'Ten' As UnitDescription
       UNION ALL
       SELECT 2.0 AS [RaisedPower] , 'Hundred' As UnitDescription
       UNION ALL
       SELECT 3.0 AS [RaisedPower] , 'Thousand' As UnitDescription
       UNION ALL
       SELECT 6.0 AS [RaisedPower] , 'Million' As UnitDescription
       UNION ALL
       SELECT 9.0 AS [RaisedPower] , 'Billion' As UnitDescription
       UNION ALL
       SELECT 12.0 AS [RaisedPower] , 'Trillion' As UnitDescription
       UNION ALL
       SELECT 15.0 AS [RaisedPower] , 'Quadrillion' As UnitDescription
       UNION ALL
       SELECT 18.0 AS [RaisedPower] , 'Quintillion' As UnitDescription
       UNION ALL
       SELECT 21.0 AS [RaisedPower] , 'Sextillion' As UnitDescription
       UNION ALL
       SELECT 24.0 AS [RaisedPower] , 'Septillion' As UnitDescription
       UNION ALL
       SELECT 27.0 AS [RaisedPower] , 'Octillion' As UnitDescription
       UNION ALL
       SELECT 30.0 AS [RaisedPower] , 'Nonillion' As UnitDescription
       UNION ALL
       SELECT 33.0  AS [RaisedPower] , 'Decillion' As UnitDescription
    
    )
    
    SELECT UnitDescription
    
       ,              POWER( CAST(10.0 AS FLOAT(53)) , [RaisedPower] )                                                             AS ReturnsFloat
       ,        CAST( POWER( CAST(10.0 AS FLOAT(53)) , [RaisedPower] )  AS NUMERIC (38,0) )                                        AS RoundingIssues
       , STR(   CAST( POWER( CAST(10.0 AS FLOAT(53)) , [RaisedPower] )  AS NUMERIC (38,0) ) ,   CAST([RaisedPower] AS INT) + 2, 0) AS LessRoundingIssues
       , FORMAT(      POWER( CAST(10.0 AS FLOAT(53)) , [RaisedPower] )  , '0')                                                     AS NicelyFormatted
    
    FROM Units
    ORDER BY [RaisedPower]