使用编程语言做计算,浮点精度是经常困扰我的问题。即使是刚学PHP的新手,在群里也会问为什么我的计算结果明显错误,而我们老是抛出一句浮点数计算存在精度问题,并没有实质性的提升被提议。比如下面计算0.57*100:zhgxun-pro:~zhgxun$php-aInteractiveshellphp>echointval(0.57*100);56php>echo0.57*100;57php>看到结果,我们已经想到了,而很多时候我们忽略了精度的问题,从某种意义上说,是因为我们没有对计算结果进行类型转换,巧妙地得到了一个更好的结果值。但是总会有(细心的)开发人员足够聪明地指定结果,并得到相反的效果。这也是我一直没有仔细思考过这个问题的原因。根据动态解释型语言的特点,变量最终是在运行时确定的,所以不要刻意转换类型,即使你确定变量应该是这个样子的。记得刚学PHP的时候,无意中在网上看到了一段高洛峰的视频。里面有一句话说,在PHP编程中,你会遇到很多一时解释不清的问题。那时,你首先想到的应该是这门语言的特性——可解释性,自然而然就会逐渐理解它。后来看了看,PHP确实有这样一个扩展库,BCMath处理任意精度的数字,对于任意精度的数学,PHP提供了二进制计算,支持用字符串表示的任意大小和精度的数字。libbcmath自PHP4.0.4起随PHP一起提供,此扩展不需要任何外部库。官方文档提供的函数如下:bcadd——2个任意精度数的加法计算bccomp——2个任意精度数的比较bcdiv——2个任意精度数的除法计算bcmod——任意精度数的模bcmul——2个任意精度数的乘法任意精度数bcpow—任意精度数的幂bcpowmod—将任意精度数提高到另一个,减去指定的模数bcscale—设置所有bc数学函数的默认小数位数bcsqrt—任意精度数的二次方根bcsub—2个任意精度数的减法如果不是设计的太复杂,只需要加减乘除就可以实现高精度的数学处理。类测试扩展命令{protected$signature='test';protected$description='测试样本';publicfunctionhandle(){//使用BCMath进行高精度计算$a=0.57;$b=100;回声整数($a*$b)。PHP_EOL;回声$a*$b。PHP_EOL;回声bcmul($a,$b)。PHP_EOL;$c=1;$d=3;回声整数($c/$d)。PHP_EOL;回声$c/$d。PHP_EOL;回声bcdiv($c,$d,6)。PHP_EOL;}}执行结果:zhgxun-pro:ankerbox_financezhgxun$phpartisantest56575700.33333333333330.333333zhgxun-pro:ankerbox_financezhgxunresult说明了,只要不刻意做数字精度转换计算,PHP其实表现的很好,而且是没有大家说的那么可怕。我认为这种语言有太多的问题。只是当我们知道PHP有专门的函数来处理这个问题的时候,不禁觉得精度问题应该这样搞。非常不尊重。
