Неправильная агрегация с плавающей точкой - PullRequest
0 голосов
/ 08 мая 2018

Я работаю над sas-запросом ниже и получаю странные экспоненциальные значения в суммированном столбце:

    data t;
    input a b $ c $ d ;
    datalines;
    481710428888 24Nov2010 NP 34961.0000
    481710428888 07Mar2013 IP 175455.7500
    481710428888 09Nov2015 WB -63835.6400
    481710428888 23Nov2015 WO 27074.9000
    481710428888 23Nov2015 WO 49240.6500
    481710428888 23Nov2015 WO 70265.5600
    481910257067 01Apr2010 NP 47129.0000
    481910257067 27May2010 WO 47129.0000
    481910257067 22Mar2013 IP 3287.6900
    481910257067 11Apr2013 WO 3287.6900

    ;
    run;

    PROC SQL;
    CREATE TABLE WORK.IAP_VLTEST AS
    SELECT DISTINCT 
           put(a, z20.) AS ACCOUNT_NUMBER,
           b,
           c,
           d,
           (CASE WHEN c  = 'WO' THEN -1 ELSE 1 END) * d AS PRVN_A 
            ,SUM (CALCULATED PRVN_A) AS iap 
    FROM T
    GROUP BY 1
    ORDER BY a ;
    QUIT;

I get the following output
ACCOUNT_NUMBER              b        c      d          PRVN_A   iap
00000000481710428888    07Mar201    IP  175455.75   175455.75   7.27596E-12
00000000481710428888    09Nov201    WB  -63835.64   -63835.64   7.27596E-12
00000000481710428888    23Nov201    WO  27074.9     -27074.9    7.27596E-12
00000000481710428888    23Nov201    WO  49240.65    -49240.65   7.27596E-12
00000000481710428888    23Nov201    WO  70265.56    -70265.56   7.27596E-12
00000000481710428888    24Nov201    NP  34961        34961      7.27596E-12
00000000481910257067    01Apr201    NP  47129        47129      0
00000000481910257067    11Apr201    WO  3287.69     -3287.69    0
00000000481910257067    22Mar201    IP  3287.69      3287.69    0
00000000481910257067    27May201    WO  47129       -47129      0

Я не понимаю, почему я получаю это странное экспоненциальное значение для первого значения a. Это происходит с несколькими строками в моем исходном наборе данных. Может ли кто-нибудь, пожалуйста, помогите понять, что здесь происходит не так. Спасибо!

1 Ответ

0 голосов
/ 08 мая 2018

Вы получаете очень небольшую сумму iap. Предполагая, что все элементы prvn_a в группе являются транзакционной группой, которая должна быть согласована с нулем, вы получаете очень маленький ненулевой результат из-за числовой точности в программном обеспечении SAS . Числовая точность десятичных значений - это то, с чем приходится сталкиваться практически во всех языках программирования. В этом нет ничего странного или ошибочного. Я бы порекомендовал округлить сумму до ближайшего 1e-5, чтобы покрыть четыре знака после запятой данных d.

, ROUND (
    SUM (CALCULATED PRVN_A), 0.00001
  ) AS iap
...