Aug. 26th, 2004

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

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

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

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

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

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

и, наконец, самое интересное - финальная резолюция начальства: баг не фиксить, тикет закрыть с диагностикой "user training issue". копейка рубль бережёт!
109: (Default)
naked protesters of 8th Avenue are charged with reckless endangerment. кого они endanger, интересно?

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