一、问题
1.今天遇到一个问题,看下面的代码
echo intval(19.9 * 100);
//输出:1989
为什么这个地方输出不是1990而是1989呢?后来查了资料,原来啊,这不仅仅是PHP的一个问题,其他的语言也都存在这样的问题,是因为计算机里面表示浮点数的时候,会存在一个精度的问题,看似有穷的小数, 在计算机的二进制表示里却是无穷的,因此PHP浮点型在进行+-*%/会存在不准确的问题,所以如果需要高精度的计算,应该采用精度数学函数进行计算。下面有一些数学计算函数,可以参考一下:
bcadd — 将两个高精度数字相加
bccomp — 比较两个高精度数字,返回-1, 0, 1
bcdiv — 将两个高精度数字相除
bcmod — 求高精度数字余数
bcmul — 将两个高精度数字相乘
bcpow — 求高精度数字乘方
bcpowmod — 求高精度数字乘方求模,数论里非常常用
bcscale — 配置默认小数点位数,相当于就是Linux bc中的”scale=”
bcsqrt — 求高精度数字平方根
bcsub — 将两个高精度数字相减
2.上面的乘法使用bcmul函数试验一下
$b = bcmul(19.9,100,2);
var_dump($b);
echo "\n";
echo intval($b);
echo "\n";
#结果:
zhoujiafei:test zhoujiafei$ php test.php
string(7) "1990.00"
1990
网友评论