我对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
答案 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