线上发现个bug,浮点数乘积之后取整,获得的数不符预期。还记得上次踩过的坑是数据库类型转换的一个问题。这个也至关于类型转换了..尴尬php
浮点数计算的精度必定要谨慎。数据库
例子以下:函数
<?php $a = 18359.1; $b = $a * 100;// float(1835910) $c = intval($a * 100);// int(1835909) var_dump($b); var_dump($c);
究其缘由,就是浮点数的二进制表示。当遇到循环的状况,就会出现这种问题。好比 18359.1 * 100在二进制运算结果后,转十进制,获得的会是1835909.99999...spa
这样intval()之后,即是1835909了。.net
知道了这样的问题,有啥更好的方案么?code
能够使用bcmath扩展,高精度函数的使用。bc 全称 Binary Calculator,二进制计算器。blog
用法见php文档:http://php.net/manual/zh/function.bcadd.php文档
bcadd — 加法 bccomp — 比较 bcdiv — 相除 bcmod — 求余数 bcmul — 乘法 bcpow — 次方 bcpowmod — 先次方而后求余数 bcscale — 给全部函数设置小数位精度 bcsqrt — 求平方根 bcsub — 减法
bc库的加减乘除的返回值是string字符串类型。这点值得注意,能够设置第三个参数,小数点位数。字符串