SQL舍入到两位小数位问题

时间:2018-10-10 04:59:39

标签: sql sql-server rounding

我对SQL输出有问题。四舍五入后的一些输出获得正确的值,但四舍五入后具有相同值的一些输出得到不正确的值。有没有人遇到这种问题?

这是我的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 个答案:

答案 0 :(得分:2)

如果类似十进制的值实际上是浮点数,则可能发生这种情况。这是一个复制品:

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

答案 1 :(得分:1)

我无法重现您的错误,因为我的SQL始终舍入值:)但是您可以对SQL强制执行一些一致的行为,请尝试以下查询(您可以从三种可能性中进行选择):

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

您可以使用我提供的方法进行自定义舍入。

答案 2 :(得分:0)

使用演员表将其隐藏为十进制,然后四舍五入

select Line, amount, round(cast(amount as decimal(10, 2),2) amount2 from xxx