【问题标题】:Drop 0 value in decimal places删除小数位 0 值
【发布时间】:2009-12-02 08:34:11
【问题描述】:

我想问是否有人知道以十进制删除 0 值的查询..

例如:字段名称百分比具有这些值

百分比

770.00000000000000000000, 340.6700000000000000000000, 96.00000000000000000000, 4400.560000000000000000000, 109.890000000000000000000, 109.00000000000000000000, 37.00000000000000000000,

目前我正在使用查询“select cast([Percent] as decimal(9,2)) as [Percent] from table”,将导致

结果

770.00, 340.67, 96.00, 4400.56, 109.89, 109.00, 37:00,

我实际上想要这个结果:->

770, 340.67, 96, 4400.56, 109.89, 109, 37、

【问题讨论】:

  • 大概您在谈论它们何时被格式化以供查看/打印?
  • 据我所知,在十进制算术中,小数点后的位数实际上很重要。因为他们告诉你有多少地方这个数字是准确的。如果您看到 770,它通常可以是 769.5 和 770.5 之间的任何数字。但是,对于 770.00,精度要高得多,数字位于 769.995 到 770.005 之间。所以我会小心在看似毫无意义的地方扔掉 0 位数字。

标签: sql decimal


【解决方案1】:

这个相当讨厌的 TSQL 可能只是完成这项工作:

select 
  case 
    right(
       cast(cast([percent] as decimal(9,2)) as nvarchar(11))
    ,2)

    when '00' then cast(cast([percent] as int) as nvarchar(11)) as [percent]
    else cast(cast([percent] as decimal(9,2)) as nvarchar(11)) as [percent]

 end
from table

当然它总是返回一个字符串,但这是您的需求所固有的,您正在寻找一个值的表示......

我认为您应该将该表示推迟到更有意义的地方(报告、数据网格?),并且您有更多工具(例如 string.format 有点工具)来更好地完成工作。

【讨论】:

    【解决方案2】:

    您可以使用 DECIMAL 和 FLOAT 的组合。小数首先将其四舍五入到 2 个小数位,然后浮动以删除不需要的 0

    例如

    select cast(cast([Percent] as decimal(9,2)) AS FLOAT) as [Percent] 
    

    以 340.69999999999999 为例,首先它舍入到 340.70,然后去掉零,得到 340.7。与任何舍入一样,都会丢失一些精度。

    【讨论】:

    • 我认为不正确:例如 select cast(cast(0.55 as decimal(10,2)) as float) as p 产生:0.55000000000000004
    • 彼得,我在 Management Studio (SQL Server) 的示例中运行了那个 SQL,但仍然得到 0.55?
    • 我在 sql 查询分析器 sql 2k 中运行它,我尝试在 MStudio 中找到一个示例
    • 有趣。我也在 SQL Query Analyzer 2000 中尝试过,得到 0.55000000000000004,但 SQL Server 2005 和 SQl Server 2008 都返回 0.55
    • 但关键是转换为浮点数,你最后做的总是会产生奇怪的结果,因为浮点数不能正确表示所有十进制值
    【解决方案3】:

    您宁愿只转换为 FLOAT。

    【讨论】:

    • 然后你可以得到值 340.69999999999999 然而
    • 没错,您最终可能会得到一个浮点数的错误陈述。除此之外,我不知道在 Sql 中执行此操作的任何方式
    【解决方案4】:

    您可以使用CONVERT 函数两次,一次通过转换为float 来删除0,一次通过style 128 将其转换为varchar

    DECLARE @Sample AS TABLE
        (
         SomeNumber DECIMAL(26, 12)
        )
    
    INSERT INTO @Sample
        VALUES  ( 770.00000000000000000000 )
    ,           ( 340.670000000000000000000 )
    ,           ( 96.00000000000000000000 )
    ,           ( 4400.56000000000000000000 )
    ,           ( 109.89000000000000000000 )
    ,           ( 109.00000000000000000000 )
    ,           ( 37.00000000000000000000 )
    
    
    SELECT CONVERT(VARCHAR(25), CONVERT(FLOAT, SomeNumber), 128) AS NoZeros
        FROM @Sample
    

    【讨论】:

      猜你喜欢
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-11
      • 2014-05-02
      • 1970-01-01
      相关资源
      最近更新 更多