php有些加法和乘法会变无限循环小数

因为系统的二进制在存储某些数据的时候,二进制可能是无限的,所以就导致加减法和乘法会变无限循环小数的问题

//实验在php 7.2下进行
var_dump(0.58 * 100);//这种情况不会有问题
var_dump(json_encode(['a' => 0.58 * 100]));

float(58)
string(23) "{"a":57.99999999999999}"

解决办法是使用更高精度的函数

var_dump(json_encode(['a' => bcmul(0.58, 100)]));
string(10) "{"a":"58"}"

bcadd — 将两个高精度数字相加

bccomp — 比较两个高精度数字,返回-1, 0, 1

bcdiv — 将两个高精度数字相除

bcmod — 求高精度数字余数

bcmul — 将两个高精度数字相乘

bcpow — 求高精度数字乘方

bcpowmod — 求高精度数字乘方求模,数论里非常常用

bcscale — 配置默认小数点位数,相当于就是Linux bc中的”scale=”

bcsqrt — 求高精度数字平方根

bcsub — 将两个高精度数字相减