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

SQL舍入到2位小数

  •  1
  • Apis  · 技术社区  · 6 年前

    这是我的SQL

    select Line, amount, round(amount,2) amount2 from xxx
    

    这是输出,你可以看到,对于 Line 1和2,但舍入值不同。

    Line    amount    amount2
    1        6.525       6.52
    2        6.525       6.53
    3        6.525       6.52
    4        2.175       2.18
    5       41.325      41.33
    6        6.525       6.52
    7        2.175       2.17
    8       19.575      19.58
    9        6.525       6.53
    10       2.175       2.18
    11      41.325      41.33
    12       2.175       2.17
    13       2.175       2.18
    14       2.175       2.18
    15       2.175       2.17
    16      36.975      36.97
    17       6.525       6.53
    18       6.525       6.53
    19      19.575      19.58
    20       6.525       6.52
    21      36.975      36.98
    22       2.175       2.18
    23       2.175       2.18
    24      19.575      19.57
    25       2.175       2.18
    26       2.175       2.18
    27       2.175       2.17
    28       2.175       2.17
    29       2.175       2.18
    30      41.325      41.32
    31       2.175       2.18
    
    3 回复  |  直到 6 年前
        1
  •  2
  •   Salman Arshad    6 年前

    如果类十进制值实际上是浮动的,则可能发生这种情况。这是一份复印件:

    DECLARE @test TABLE (line INT, amount FLOAT);
    INSERT INTO @test VALUES
    (1, 6.525),
    (2, 6.524999999999999);
    
    SELECT line, amount, FORMAT(amount, 'G17') AS dotnet_g17_formatted, ROUND(amount, 2) AS amount2
    FROM @test
    

    结果:

    | line | amount | dotnet_g17_formatted | amount2 |
    |------|--------|----------------------|---------|
    | 1    | 6.525  | 6.5250000000000004   | 6.53    |
    | 2    | 6.525  | 6.5249999999999986   | 6.52    |
    

    您可以看到,浮点值存储为近似值,并显示为近似值。

    最合适的解决方案是将财务价值存储为 DECIMAL .

        2
  •  1
  •   Michał Turczyn    6 年前

    select line, amount, 
           round(amount, 2, 1) truncated, --third parameter, if it's other than 0, makes round function to truncate value
           ceiling(amount * 100) / 100 roundUp,
           floor(amount * 100) / 100 roundDown
    from @tbl
    

    您可以使用我提供的向上取整和向下取整方法编写自定义取整。

        3
  •  0
  •   Fahmi    6 年前

    select Line, amount, round(cast(amount as decimal(10, 2),2) amount2 from xxx
    
    推荐文章