109: (Default)
[personal profile] 109
сегодня обнаружил замечательный, классический баг.

есть счета, которые надо оплачивать, и есть чеки, которыми платится, причём один счёт можно оплатить несколькими чеками. ну и есть приложение, которое в определённом месте проверяет, сколько уже по этому счёту заплачено и, соответственно, не даёт переплатить. а делает оно это примерно так (псевдокод):

(double) остаток = (double) текущий_остаток - (real) сколько_платим;
if (остаток < 0.0)
    переплачивать_нельзя;
программистам уже всё должно быть понятно, а счастливчикам поясню, что разница двух разных типов с плавающей точкой часто будет равна не точно нулю, а чему-нибудь типа -3*10^-15.

особый цинизм данному коду придаёт решение программиста написать не if (остаток < 0), а if (остаток < 0.0), типа "пытался играть, но не угадал ни одной буквы".

приложение в продакшене уже лет пять, что возбуждает очевидный вопрос, а что же делает бухгалтерия, когда нужно заплатить сполна, а приложение не даёт? очень просто: бухгалтерия не доплачивает один цент. а получателю либо похеру, либо он добавляет недоплаченный цент к следующему счёту. но факт остаётся фактом: половина (по теории вероятности) счетов недоплачена на один цент. а потом евреи спрашивают, почему их не любят :-)

да, а как открылось-то: в бухгалтерии наняли нового человека, а эту деталь объяснить забыли. человек в аппсаппорт, аппсаппорт ко мне, я нахожу в чём причина и докладываю начальству.

и, наконец, самое интересное - финальная резолюция начальства: баг не фиксить, тикет закрыть с диагностикой "user training issue". копейка рубль бережёт!

(no subject)

Date: 2004-08-26 11:06 pm (UTC)
From: [identity profile] ex-zadoff59.livejournal.com
я как то видел биржевую торговлю с таким багом.
типа пачиму наш триггер "срочно продать эти акции" не срабатывает

(no subject)

Date: 2004-08-27 01:56 am (UTC)
From: [identity profile] msh.livejournal.com
А-а? Деньги считают с плавающей точкой?

(ничего я в вашей бкхгалтерии не понимаю)

(no subject)

Date: 2004-08-27 02:14 am (UTC)
From: [identity profile] 109.livejournal.com
деньги считают оракловым типом NUMBER (без спецификаторов, "по историческим причинам"). а изложенным мной способом только производится "validation".

(no subject)

Date: 2004-08-27 02:25 pm (UTC)
From: [identity profile] sanekk.livejournal.com
Бухахахахахаха. User training issue

(no subject)

Date: 2004-10-04 10:14 pm (UTC)
From: [identity profile] pingva.livejournal.com
класс.

Profile

109: (Default)
109

March 2019

S M T W T F S
     12
3456789
101112131415 16
17181920212223
24252627282930
31      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags