В американском штате Нью-Гэмпшир торговый автомат на бензоколонке взял с мужчины 23 квадриллиона долларов за пачку сигарет. Об этом 15 июля сообщает агентство Associated Press.
Джош Мушински рассказал журналистам, что не сразу обнаружил, во сколько ему обошлись сигареты. Лишь через некоторое время после покупки он проверил свою кредитную карту и увидел цифру 23148855308184500. «Я думал, что кто-то купил Европу с помощью моей кредитной карточки», — сказал Мушински BBC News.
Это просто догадки или реальное знание «предмета»?
Если догадки, то я выскажу свою: в банке все же оперируют целыми числами, просто хранятся данные в минимально возможной валютной еденице (для долларов — это 1 цент, для рублей — 1 копейка).
Все таки операции с целыми числами более точны и надежны нежели любые операции с числами с плавающей точкой (даже какой бы повышенной точности она не была). имхо
Всё дело в системе счисления — софт работающий с деньгами, работает с десятичной системой, а не с двоичной.
Это касается особенностей работы с числами < 1 и округлений.
Соответственно используются различные варианты BCD записи.
Где тут целочисленная? Если с вас списываются / начисляются проценты, вас счёт получатся далеко не целочисленным. А на аккумуляции ошибок округления было проведено немало афёр в своё время.
Набор операций с числами с фиксированной точкой эквивалентен набору операций с целыми числами, разве нет?
Грубо говоря, 123.45 руб. — это 12345 коп.
Я думал, начисление процентов происходит с точностью до копеек по правилам арифметического округления (и, afair, так в договоре даже было написано). Зачем для арифметического округления нужна десятичная запись, мне не ясно. Можете пояснить чуть подробнее?
Однако мой банк например обменивается с процессинговым центром обычными форматированными текстовыми файлами с транзакциями по картам в которых между прочим есть и пробелы в некоторых местах :)
>Если перевести его в шестнадцатеричную систему, то мы получим
А если разбить его как 23 — 1 + 488 + 55 + 3 + 0 + 8 + 1 + 84 + 5 + 0000, то получим 666!
Думаю, при том, что C/C++ позволяют из const char* получить long* без каких-либо затруднений, простым кастингом к нужному типу, и «строка превращается… превращается… превращается строка… в стопицот квадриллионов!»
Вот мне вообще интересно как такое могло произойти?
Ведь по сути даже если произошла какая-то ошибка на каком-то терминале, то система не могла позволить списать настолько огромную сумму (я думаю овердрафт на такие циферки не дают :)
Следовательно ошибка в самой платежной системе!
А от этого становится грустно — сам являюсь владельцем карт Visa и такие новости, честно говоря, неприятны :(
Подробности о 17-значном глюке Visa