php小数点位数字,派的小数点后50位数字
作者
在项目的开发中尤其是在和财务资金相关的项目里php小数点位数字,对数据的精度要求是很高的,甚至是苛刻的。
精度的问题并不是PHP本身的问题,只要有浮点数计算的可能都会存在精度的问题,在这里php小数点位数字我们不深究具体的产生原因,想了解详细的需求产生问题可以查看浮点数的表示。
首先我们来看一个简单的例子:
$a = 0.1;$b = 0.7;var_dump(($a+$b) == 0.8);打印输出的结果是:boolean false,很奇怪吧,正常我们觉得这应该就是相等的,应该输出为:boolean true 才对。这是因为不可能精确地用有限位数表达某些十进制分数。例如:十进制的 1/3 变成了 0.3333333...
那么我怎么来解决这个精度计算的问题呢php小数点位数字?PHP4版本以上为我们准备一下函数:
bcadd — 2个任意精度数字的加法计算bccomp — 比较两个任意精度的数字bcdiv — 2个任意精度的数字除法计算bcmod — 对一个任意精度数字取模bcmul — 2个任意精度数字乘法计算cpow — 任意精度数字的乘方bcpowmod — Raise an arbitrary precision number to another, reduced by a specified modulu *** cscale — 设置所有bc数学函数的默认小数点保留位数bcsqrt — 任意精度数字的二次方根bcsub — 2个任意精度数字的减法我们来看看bcadd的使用:
bcadd ( string $left_operand , string $right_operand , int $scale = ? ) : string// $left_operand $right_operand 都为相加的两个数,$scale 为小数点后的小数位数我们使用bcadd来改造一下前面的代码来看看运行结果:
$a = 0.1;$b = 0.7;var_dump(bcadd($a,$b,2) == 0.8);这次打印输出就是:boolean true
接着再看看我们经常在对比账户余额充足的时候可以使用的 *** :bccomp
bccomp ( string $left_operand , string $right_operand , int $scale = int ) : int如果两个数相等返回0,左边的数left_operand比较右边的数right_operand大返回1,否则返回-1。
echo bccomp(2, 3); // -1echo bccomp(1.0002, 1, 3); // 0echo bccomp(3.24553533, 3, 5); // 1目录
推荐阅读
0 条评论
本站已关闭游客评论,请登录或者注册后再评论吧~