У меня небольшое финансовое приложение с PHP в качестве внешнего интерфейса и MySQL в качестве внутреннего. У меня есть древние предрассудки, и я храню денежные значения в MySQL как целое число центов. Мои HTML-формы позволяют вводить долларовые значения, такие как «156.64», и я использую PHP для преобразования их в центы, а затем сохраняю центы в базе данных.
У меня есть функция, которая очищает долларовую стоимость от формы и конвертирует ее в центы. Я удаляю начальный текст, я удаляю конечный текст, умножаю на 100 и преобразую в целое число. Этот последний шаг
$cents = (integer) ($dollars * 100);
Это прекрасно работает практически для всего, кроме очень немногих значений, таких как «156.64», которые последовательно преобразуются в 15663 цента. Почему он это делает?
Если я сделаю это:
$cents = (integer) ($dollars * 100 + 0.5);
тогда это последовательно работает. Почему мне нужно добавить это значение округления?
Кроме того, мои предрассудки относительно хранения денежных сумм в виде целых чисел, а не значений с плавающей запятой, больше не нужны? Будут ли современные вычисления с плавающей запятой производить аккуратно округленные и точные денежные значения, достаточные для ведения 100% точного учета?