SAS - PROC SQL - случай, когда арифметика не имеет смысла - PullRequest
1 голос
/ 30 октября 2019

В SAS Proc SQL я использую этот оператор Case, чтобы попытаться пометить политики, которые имеют различия, отличные от 0,015 в год:

CASE WHEN (MOD1 - MOD0) NOT = .015 THEN 2
     WHEN (MOD2 - MOD1) NOT = .015 THEN 3
     WHEN (MOD3 - MOD2) NOT = .015 THEN 4
     WHEN (MOD4 - MOD3) NOT = .015 THEN 5
     ELSE 0 END

Странно то, что он не работает, когда чувствуеткак и должно быть. (например, mod1 = .955 и mod0 = .94, но первое утверждение считает, что это не .015) Сначала я полагал, что это проблема с цифрами, но это никогда не работало.

Как ни странно, это работает, и я не знаю почему.

CASE WHEN (MOD1 - MOD0) NOT = (1- .985) THEN 2
     WHEN (MOD2 - MOD1) NOT = (1- .985) THEN 3
     WHEN (MOD3 - MOD2) NOT = (1- .985) THEN 4
     WHEN (MOD4 - MOD3) NOT = (1- .985) THEN 5
     ELSE 0 END

Но это не работает

CASE WHEN (MOD1 - MOD0) NOT = (.2- .185) THEN 2
     WHEN (MOD2 - MOD1) NOT = (.2- .185) THEN 3
     WHEN (MOD3 - MOD2) NOT = (.2- .185) THEN 4
     WHEN (MOD4 - MOD3) NOT = (.2- .185) THEN 5
     ELSE 0 END

У меня есть обходные пути, чтобы обойти любое из них (включая использование шагов с данными), поэтому я не ищу решений длявопрос, но больше ответов о том, что здесь происходит. Мне нравится понимать, почему вещи не работают, а не просто знать, что я могу и не могу сделать.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 30 октября 2019

Вы можете использовать функцию round :

CASE WHEN round(MOD1 - MOD0,.0001) NOT = .015 THEN 2
     WHEN round(MOD2- MOD1,.0001) NOT = .015 THEN 3 
     WHEN round(MOD3 - MOD2,.0001) NOT = .015 THEN 4
     WHEN round(MOD4 - MOD3,.0001) NOT = .015 THEN 5
     ELSE 0 END 
0 голосов
/ 30 октября 2019

Проблема, вероятно, в арифметике с плавающей запятой. Точное сравнение с поплавками проблематично. Попробуйте что-то вроде этого:

CASE WHEN ABS((MOD1 - MOD0) - 0.015) > 0.00001 THEN 2
     WHEN ABS((MOD2 - MOD1) - 0.015) > 0.00001 THEN 3
     WHEN ABS((MOD3 - MOD2) - 0.015) > 0.00001 THEN 4
     WHEN ABS((MOD4 - MOD3) - 0.015) > 0.00001 THEN 5
     ELSE 0
END

0.00001 является произвольным. Это просто небольшое число.

...