Мы все знаем, что работа с числами с плавающей запятой может привести к следующим проблемам:
echo intval(0.58*100);//57
А использование функций bcmath поможет:
echo bcmul('0.58', '100', 2);//58.00
Руководство по PHP:
//Multiply the left_operand by the right_operand.
string bcmul(string $left_operand , string $right_operand [, int $scale = 0 ])
Но почему это будет работать?
Я заметил, что первые два параметра должны быть строковыми. Интересно, это потому, что эти функции обрабатывают числа строковым способом?
Числа, используемые с bcmath
должны быть представлены в виде строк, потому что если вы используете собственные форматы чисел php, такие как integer или float, то вы просто не можете выразить все значения.
Простейший пример — целочисленный тип. Целые числа ограничены максимальным значением, определяемым константой PHP_INT_MAX
, Если вы попытаетесь записать любое число, большее, чем этот php, вы не сможете представить это точное число. Это связано с тем, что php использует заранее определенный объем памяти для хранения целых чисел.
Смотрите этот пример:
echo PHP_INT_MAX;
echo "\n";
echo PHP_INT_MAX + 1;
Выход:
9223372036854775807
9.2233720368548E+18
Как вы можете видеть второе значение не 9223372036854775808, что было бы правильно, но некоторые другие (аналогичные) значения.
Других решений пока нет …