var_dump((float)'79.10')
возвращает мне 79.09999999999999
. Я пробовал миллион способов попробовать округлить это значение до исходного 79.10 как float ( number_format
, round
), и я не могу найти способ сделать это.
Есть ли способ получить значение с float
79.10 из исходной строки?
Нет, потому что 0.1
(и, как правило, 79.1
) на самом деле не представляет собой float
(предполагая однократную или двойную точность кодирования IEEE-754). 0.1
в этом кодировании имеет бесконечно повторяющуюся дробную часть:
1001 1001 1001 1001 ...
Вам придется либо оставить его в виде строки, либо принять тот факт, что схема кодирования не имеет бесконечной точности и работает вокруг нее.
Примером последнего является только вывод чисел с определенной точностью, например две десятичные цифры, а также для обеспечения того, чтобы (in) сравнения равенства использовали абсолютные или относительные дельта для сравнения чисел.
Когда вы добавляете числа, требуется довольно много операций, чтобы эффекты неточности стали видимыми на уровне сотых. Это ускоряется при умножении, но все-таки требуется некоторое время.
В то время как paxdiablo прав, а работа с поплавками не имеет бесконечной точности, я обнаружил, что действительно можно представить 79.10 как float, предварительно настроив настройку PHP:
ini_set('precision', 15);
После этого var_dump((float)'79.10')
корректно возвращает float из 79.1
. Различные результаты, которые каждый видит на своих машинах, по-видимому, являются результатом того, что каждый из них имеет разные значения точности, установленные по умолчанию.
Это невозможно как float
потому что он не обеспечивает достаточной точности (см. Здесь дополнительную информацию)
Теперь, на большинстве языков вы можете применить его к double
… К сожалению, в PHP, float
и double
используют точно такой же базовый тип данных, поэтому, чтобы получить нужное значение, вам придется перекомпилировать PHP.
Ваш лучший вариант – использовать что-то вроде PHP BCMath для произвольной точности.