У меня проблемы с получением bcmath для работы с биткойн-фракциями на моем сервере php 7.1, ubuntu 18. Посмотрите на следующий код
bcscale(8);
$x1 = bcsub(0.04217 ,0.00007, 8);
$x2 = 0.04217 - 0.00007 ;
dd($x1 , $x2);
Результат
"0.04217000"0.0421
Как вы можете видеть, bcmath get возвращает первый операнд с несколькими добавленными к нему нулями ??.
Есть идеи?
Руководство немного тонкое, но параметры должны быть строками. Если вы сделаете их струнами, это будет работать.
bcscale(8);
$x1 = bcsub('0.04217' ,'0.00007', 8);
$x2 = 0.04217 - 0.00007 ;
echo 'x1 = '. $x1 . PHP_EOL;
echo 'x2 = '. $x2;
РЕЗУЛЬТАТ
x1 = 0.04210000
x2 = 0.0421
Также из руководства
предосторожность
Передача значений типа float в функцию BCMath, которая ожидает строку как операнд, может не дать желаемого эффекта из-за того, как PHP преобразует значения с плавающей точкой в строку, а именно, что строка может быть в экспоненциальной записи (что не поддерживается BCMath), и что десятичный разделитель зависит от локали (в то время как BCMath всегда ожидает десятичную точку).
Что касается точности,
bcscale(8);
$x1 = bcsub('0.04217' ,'0.00007', 6);
// ^
$x2 = 0.04217 - 0.00007 ;
echo 'x1 = '. $x1 . PHP_EOL;
echo 'x2 = '. $x2;
РЕЗУЛЬТАТ
x1 = 0.042100
x2 = 0.0421
А также
bcscale(8);
$x1 = bcsub('0.04217' ,'0.00007', 4);
// ^
$x2 = 0.04217 - 0.00007 ;
echo 'x1 = '. $x1 . PHP_EOL;
echo 'x2 = '. $x2;
РЕЗУЛЬТАТ
x1 = 0.0421
x2 = 0.0421
Других решений пока нет …