PHP перевод денежной строки в целочисленную ошибку

У меня есть небольшое финансовое приложение с PHP в качестве внешнего интерфейса и MySQL в качестве внутреннего. У меня есть древние предрассудки, и я храню денежные значения в MySQL как целое число центов. Мои HTML-формы позволяют вводить долларовые значения, такие как «156.64», и я использую PHP для преобразования их в центы, а затем сохраняю центы в базе данных.

У меня есть функция, которая очищает долларовую стоимость от формы и конвертирует ее в центы. Я удаляю начальный текст, я удаляю конечный текст, я умножаю на 100 и преобразовываю в целое число. Этот последний шаг

$cents = (integer) ($dollars * 100);

Это прекрасно работает практически для всего, кроме очень немногих значений, таких как «156,64», которые последовательно преобразуются в 15663 цента. Почему он это делает?

Если я сделаю это:

$cents = (integer) ($dollars * 100 + 0.5);

тогда это последовательно работает. Почему мне нужно добавить это значение округления?

Кроме того, мои предрассудки о хранении денежных сумм в виде целых чисел, а не значений с плавающей запятой, больше не нужны? Будут ли современные вычисления с плавающей точкой производить округленные и точные денежные значения, достаточные для ведения 100% точного учета?

Ответы на вопрос(9)

Ваш ответ на вопрос