Работа с ошибками округления в SAS - PullRequest
0 голосов
/ 21 февраля 2019

Я работаю с большим приложением данных и столкнулся с ошибкой округления, которую я не могу исправить.Код в основном выглядит следующим образом:

proc sql;
select round(amount,.01) - round(amount * (percentage/100),.01) as amount
from data;
quit;

Я пробовал различные способы исправления, но, похоже, все они приводят к другим ошибкам округления в другом направлении.Для строки, которая выдает количество ошибок = 56,45 и процент = 10. Я получаю результат, равный 50,80, и надеюсь, что результат будет равен 50,81.Я не могу принять ошибку округления, поскольку существует отдельный процесс, который отменяет транзакции, у которых нет ошибки округления, и, в конце концов, сторнирования плюс деталь, вызывающая ошибку округления, должны равняться нулю.

Код Iпробовал:

select round((((100-percentage)/100)*amount), .01)
select round(amount,.01) - round(amount * (percentage/100),.001) as amount

второй из которых устраняет проблему, но создает три ошибки округления в другом направлении.

Любая помощь очень ценится.

Спасибо.

1 Ответ

0 голосов
/ 21 февраля 2019

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

  1. Убедитесь, что вы работаете с десятичными типами данных, а не с плавающей точкой.
  2. Раунд после Вы заканчиваете математику.Вы округляете каждый шаг своего вычисления в двух ваших фрагментах кода, что может привести к неверным результатам.
  3. Будьте очень осторожны с порядком операций / скобками.Например, 100-percentage/100 оценивается как 100-10/100 = 100-0.1 = 99.9, что, я думаю, не то, что вы хотите.Точно так же у вас есть еще одна близкая скобка, чем открытая в этой строке.
...