Неправильный расчет в SQL-сервере - PullRequest
3 голосов
/ 28 апреля 2011

В качестве примера я нашел простой расчет, такой как:

select cast(200.00 as float) + 1908.30 + 170.00 + (-1150.00) + (-1128.30)

Как обычное дополнение, это приводит к 0.00, но SQL Server показывает результат как 2.27373675443232E-13.

Почемуэто и как мне этого избежать?

Ответы [ 3 ]

6 голосов
/ 28 апреля 2011

Эта ошибка присуща типу данных float и является причиной существования типа decimal. Никогда не делайте денежные расчеты как float значения!

Вы можете взглянуть на Что должен знать каждый компьютерный специалист об арифметике с плавающей точкой , или на любой результат Google для "ошибки округления с плавающей точкой".

1 голос
/ 28 апреля 2011
select cast(200.00 as decimal(10,2)) + 1908.30 + 170.00 + (-1150.00) + (-1128.30)
0 голосов
/ 28 апреля 2011

Это не уникально для sql. Например, в Python:

'%.50f' % (200.+1908.3+170.-1150.-1128.30)

приведет к

'0.00000000000022737367544323205947875976562500000000'

То же самое, что и у тебя.

Это присуще неспособности представить каждое число, которое может быть выражено в виде конечной суммы степеней 10 (например, 1908.3), в виде конечной суммы положительных и отрицательных степеней 2, что представляет его как число с плавающей точкой. делает. Происходит неизбежное приближение, и когда вы выполняете операции над этими приближениями, конечный результат может иметь небольшую ошибку. Ссылка, предоставленная Амаданом, объясняет это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...