浮点数乘积的取整intval,以及高精度函数bcmath的使用

  线上发现个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字符串类型。这点值得注意,能够设置第三个参数,小数点位数。字符串

相关文章
相关标签/搜索