SQL округление до 2 знаков после запятой - PullRequest
0 голосов
/ 10 октября 2018

У меня проблема с выводом 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 голосов
/ 10 октября 2018

Я не могу воспроизвести вашу ошибку, поскольку мой 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

Вы можете написать пользовательское округление, используя методы для округления в большую и меньшую сторону, которые я предоставил.

0 голосов
/ 10 октября 2018

Это может произойти, если ваши десятичные значения на самом деле плавающие.Вот репродукция:

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.

0 голосов
/ 10 октября 2018

используйте приведение, чтобы преобразовать его в десятичную, а затем округлить

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