Почему Bcmath возвращает неточные результаты

У меня проблемы с получением 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 возвращает первый операнд с несколькими добавленными к нему нулями ??.
Есть идеи?

-1

Решение

Руководство немного тонкое, но параметры должны быть строками. Если вы сделаете их струнами, это будет работать.

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
2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector