Почему DECIMAL ведет себя как FLOAT? - PullRequest
0 голосов
/ 17 октября 2018

Даже если DECIMAL является точным числовым типом (в отличие от FLOAT, который является приблизительным), он ведет себя довольно странно в следующем примере:

DECLARE @DECIMAL_VALUE1 DECIMAL(20,9) = 504.70 / 0.151562
DECLARE @DECIMAL_VALUE2 DECIMAL(20,0) = 504.70 / 0.151562
DECLARE @INTEGER_VALUE INT            = 504.70 / 0.151562

SELECT
    @DECIMAL_VALUE1 AS DECIMAL_VALUE1,  -- 3329.990366978
    @DECIMAL_VALUE2 AS DECIMAL_VALUE2,  -- 3330
    @INTEGER_VALUE  AS INTEGER_VALUE    -- 3329

Значение, отличное от 3329, вызывает ошибкув нашем приложении.Создание типа переменной INTEGER решило нашу проблему, но я не могу понять, почему она была вызвана.

1 Ответ

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

Вы спросили: «Почему это было вызвано в первую очередь?»:

Чтобы понять, почему вам необходимо понять природу каждого типа данных и то, как он работает в SQL Server.

  • Целочисленная математика усекает десятичные дроби (без округления, аналогично функции "FLOOR" (вот почему вы получаете 3329)).
  • Десятичное число с 0-местными раундами (именно поэтому вы получаете 3330 при 3329,99 раундах вверх)
  • Десятичное число с точностью / масштабным округлением до N-й шкалы (именно поэтому вы получаете 3329,990366978 ...).

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

Я предпочитаю игнорировать комментарий с плавающей точкой, поскольку он не имеет отношения к вопросу.

...