SQL Server результат приведения арифметики - PullRequest
0 голосов
/ 03 августа 2011

Я просто смотрю на некоторые очень незначительные несоответствия в отчете, который я составляю, и меня смущает вопрос о том, что является лучшим методом в SQL Server для приведения типов, и если кто-то может мне указать правильное направление, чтобы объяснить что я вижу.

Очень небольшая ошибка 1p в некоторых случаях при использовании текущего расчета на данных, аналогичных показанным в таблице примера @data.

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

Приведенный ниже код дает пример вывода:

    declare @data table (qty decimal(24,12), price decimal(24,12), multiplier decimal(24,12), rate1 decimal(24,12), rate2 decimal(24,12))

    insert into @data
        select 21505.000000000000, 30.475000000000, 1.000000000000,1.166500000000, 1.166500000000


    select round(data.current_method, 2) as current_method_round, round(data.expected_result_method, 2) as expected_result_round, * from 
        (select 
        ((qty * price * multiplier) /rate1) * rate2 as current_method,
         cast(cast(cast(qty * price * multiplier as decimal(24,12)) / rate1 as decimal(24,12)) * rate2 as decimal(24,12)) as expected_result_method,
        ((21505.000000000000 * 30.475000000000 * 1.000000000000) / 1.166500000000) * 1.166500000000 as checkvalue, 
        *
        from @data ) data

Ответы [ 2 ]

1 голос
/ 11 августа 2011

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

Тот факт, что вы получаете два разных результата из этого:

       ,((qty * price * multiplier) / rate1) * rate2 as current_method
       ,((qty * price * multiplier) * rate2) / rate1 as current_method2

Подразумевает, что промежуточное выражение в вашем current_method имеет проблему точности.

0 голосов
/ 11 августа 2011

Эд ... не делай этого в SQL!Подобные вещи выглядят ужасно и должны быть в промежуточном программном обеспечении, где лучше понять смысл результатов кастинга.

[РЕДАКТИРОВАТЬ] Я подозреваю, что что-то где-то конвертируется в число с плавающей запятой, возможно, связанное с оператором деления.1p нельзя правильно представить в виде числа с плавающей запятой.

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