为什么Bcmath返回不准确的结果



在我的服务器php7.1,ubuntu18上,我很难让bcmath处理基于比特币的分数。查看以下代码

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将float值转换为字符串的方式,即字符串可能采用指数表示法(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

最新更新