【问题标题】:Getting Max Decimal places in a float SQL Server 2012在浮点 SQL Server 2012 中获取最大小数位数
【发布时间】:2015-05-30 13:45:30
【问题描述】:

我了解 float 以二进制形式存储,是 SQL Server 中的一种表示形式。但是,我需要表中浮点列中表示的最大小数位数。我找到了this link,它解释了如何获取每行的小数位数。但是,我无法弄清楚如何获得该结果的最大值。本质上,这就是我想要做的。

SELECT MAX
       (Decimals = CASE Charindex('.', [QUANTITY])
                    WHEN 0 THEN 0
                    ELSE
   Len (Cast(Cast(Reverse(CONVERT(VARCHAR(50), [QUANTITY], 128)
                     ) AS FLOAT) AS BIGINT))
                  END)
FROM   [schema].[table]

这在 END 之后给了我一个语法错误。我尝试了一个子查询,但似乎也无法使语法正确。

【问题讨论】:

    标签: sql-server floating-point subquery


    【解决方案1】:

    看起来这就是答案...

    SELECT MAX
           (CASE Charindex('.', [QUANTITY])
                        WHEN 0 THEN 0
                        ELSE
       Len (Cast(Cast(Reverse(CONVERT(VARCHAR(50), [QUANTITY], 128)
                         ) AS FLOAT) AS BIGINT))
                      END)
    FROM   [schema].[table]
    

    对不起大家。我以为我在我的许多推导中都尝试过这个,但显然没有,或者我有一个错字。如果有人可以解释为什么将“Decimals =”放入会使其无效,这将有助于我理解原因。

    【讨论】:

    • 如果您尝试命名结果列,则名称应位于子句之后:SELECT MAX(CASE... WHEN... END) AS Decimals FROM...
    【解决方案2】:

    您可以将convert() 函数与style = 128 一起使用,但您可以读到这是[Included for legacy reasons and might be deprecated in a future release]。另一种方法是使用str() 函数:

    declare @temp_data table (quantity float)
    
    insert into @temp_data
    select 1.55552 union all
    select 0.545365788
    
    ;with cte as (
        select convert(varchar(max), quantity, 128) as quantity from @temp_data
    )
    select 
        max(
            case
                when charindex('.', quantity) = 0 then 0
                else len(quantity) - charindex('.', quantity)
            end
        )
    from cte
    
    ;with cte as (
        select rtrim(ltrim(str(quantity, 100, 100))) as quantity from @temp_data
    )
    select
        max(
            case
                when charindex('.', quantity) = 0 then 0
                else len(cast(cast(reverse(quantity) as float) as bigint))
            end
        )
    from cte
    

    【讨论】:

      【解决方案3】:
      SELECT   MAX ( CASE Charindex('.', <ColumnName>)
                        WHEN 0
                           THEN
                              0
                           ELSE
                              LEN( CAST( CAST( REVERSE( CONVERT( varchar(50), <ColumnName>, 128 ) ) AS float) AS bigint))
                     END
                   ) AS [FloatPrecision]
             , <ColumnName>
         FROM <schema>.<tablename>
         GROUP BY <ColumnName>
         ORDER BY [FloatPrecision] DESC;
      

      此解决方案为您提供浮点精度,实际值从最精确到最小。就我而言,我有一些成本值精确到小数点后 11 位,这没有多大意义。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-21
        • 2017-08-15
        • 2019-01-06
        • 2020-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-13
        相关资源
        最近更新 更多