一、前言

  我们在进行php开发的时候经常会遇到浮点型的问题,特别是涉及金额的部分,常常需要进行加减运算。当小数点的位数比较多的时候,往往容易犯一些很低级的错误。这里记录一下php的精度计算和封装的小demo

二、关于php的高精度问题

1、概念解释

这篇文章的解释最清楚:

php高精度计算问题

2、高精度数值对比大小问题

下面这篇文章讲的很好:

临时发一个项目遇到的PHP浮点计算问题

默认保留两位小数

bcadd(参数1,参数2,参数3)

参数1 和2 是要相加的参数 3是保留几位小数。

1. bcadd 任意精度数的相加
2. bcsub 任意精度数的减法
3. bcmul 乘法, bcdiv除法 
4. bcmod 取余数。 (比%功能更强大)
5. bcpow 幂函数运算
6. bcsqrt 平方根
7. sqrt 平方根运算
7. pow求幂
8. abs 求绝对值

9. pi 得到圆周率数值

10.bccomp — 比较

三、封装的小demo

//$m和$n代表传入的两个数值,主要就是这两个数值之间的比较
//$x代表传入的方法,比如是;add,sub等
//$scale 代表传入的小数点位数。这个根据需求更改即可
public function calc($m,$n,$x,$scale){
$errors=array(
'被除数不能为零',
'负数没有平方根'
);
switch($x){
case 'add':
$t=bcadd($m,$n,$scale);
break;
case 'sub':
$t=bcsub($m,$n,$scale);
break;
case 'mul':
$t=bcmul($m,$n);
break;
case 'div':
if($n!=0){
$t=bcdiv($m,$n);
}else{
return $errors[0];
}
break;
case 'pow':
$t=bcpow($m,$n);
break;
case 'mod':
if($n!=0){
$t=bcmod($m,$n);
}else{
return $errors[0];
}
break;
case 'sqrt':
if($m>=0){
$t=bcsqrt($m);
}else{
return $errors[1];
}
break;
}
return $t;
}

调用方式:

$result= $this->calc(2.001,3.002,'sub',3);

  结束!!!

php的精度计算问题(bcadd和bcsub)的更多相关文章

  1. PHP中的精确计算bcadd,bcsub,bcmul,bcdiv

    引言:一定要确保数据的准确性.这是一个好的程序员的基本素养. <?php /** * 精确加法 * @param [type] $a [description] * @param [type] ...

  2. php精度计算问题

    如果用php的+-*/计算浮点数的时候,可能会遇到一些计算结果错误的问题,比如echo intval( 0.58*100 );会打印57,而不是58,这个其实是计算机底层二进制无法精确表示浮点数的一个 ...

  3. 黄聪:php精度计算问题

    如果用php的+-*/计算浮点数的时候,可能会遇到一些计算结果错误的问题,比如echo intval( 0.58*100 );会打印57,而不是58,这个其实是计算机底层二进制无法精确表示浮点数的一个 ...

  4. php 精度计算问题

    PHP var_dump(intval(0.58 * 100)); 正确结果是 57,而不是 58 浮点运算惹的祸 其实这些结果都并非语言的 bug,但和语言的实现原理有关, js 所有数字统一为 N ...

  5. BigDecimal类(精度计算类)的加减乘除

    BigDecimal类 对于不需要任何准确计算精度的数字可以直接使用float或double,但是如果需要精确计算的结果,则必须使用BigDecimal类,而且使用BigDecimal类也可以进行大数 ...

  6. C++大数精度计算(带小数点)

    转: (原出处不可考,若有侵权,请联系我立即删除) 头文件: // WTNumber.h: interface for the CWTNumber class. // //////////////// ...

  7. BigDecimal工具类处理精度计算

    /** * Created by My_coder on 2017-07-27. * 加减乘除计算工具类 */ public class BigDecimalUtil { private BigDec ...

  8. PHP_保留两位小数并且四舍五入(可用于精度计算)_保留两位小数并且不四舍五入

    小数例子: PHP保留两位小数并且四舍五入 1 $n=0.1265489; 2 echo sprintf("%.2f", $n); // 0.13 大家可以看到我们用到了sprin ...

  9. Java精度计算与舍入

    用到的类: 类 BigDecimal:不可变的.任意精度的有符号十进制数.BigDecimal 由任意精度的整数非标度值 和 32 位的整数标度 (scale) 组成.如果为零或正数,则标度是小数点后 ...

随机推荐

  1. WCE-hash注入工具使用

    wce的使用说明如下 参数解释:-l          列出登录的会话和NTLM凭据(默认值)-s               修改当前登录会话的NTLM凭据 参数:<用户名>:<域 ...

  2. HTML DIV充满整个屏幕

    <!DOCTYPE html> <html> <head> <title>A Little Game!</title> <meta c ...

  3. opencv::形态学操作

    形态学操作 开操作- open 闭操作- close 形态学梯度- Morphological Gradient 顶帽 – top hat 黑帽 – black hat 开操作- open 先腐蚀后膨 ...

  4. 一个有趣的C语言问题

    这个问题是知乎上的一个问题,看了以后觉得比较有意思.代码短到只有十多行,但是这么短的代码却输出了很奇怪的结果.很多人回答的时候都是站在理论的角度上说明代码的问题,但是实际的问题还是没有说明其中的问题. ...

  5. 《如何学习基于ARM嵌入式系统》笔记整理

    author:Peong time:20190603 如何学习基于ARM嵌入式系统 一.嵌入式系统的概念 从硬件上讲,将外围器件,与CPU集成在一起. 从操作系统上讲,定制符合要求的系统内核 从应用上 ...

  6. sublime设置 reindent 快捷键

    设置快捷键 使用快捷键 cmd + shift + p 打开控制面板 输入 key 关键词 点击进入 Key Bindings -User 添加如下代码 { "keys": [&q ...

  7. 你好,Go语言

    本文是「vangoleo的Go语言学习笔记」系列文章之一. 官网: http://www.vangoleo.com/go/hello-golang/ 我在2015年第一次接触Go语言,完成了Hello ...

  8. unity 初始化数据存储问题

    在用unity进行开发的时初始化的数据和中间实时生成的数据存储不同,初始化文件数据建议安放在asset-StreamingAssets文件下,需要时读取取来.运行时所需的实时文件或数据持久化的xml文 ...

  9. python常用算法(7)——动态规划,回溯法

    引言:从斐波那契数列看动态规划 斐波那契数列:Fn = Fn-1 + Fn-2    ( n = 1,2     fib(1) = fib(2) = 1) 练习:使用递归和非递归的方法来求解斐波那契数 ...

  10. 2018.8.6 Python中的文件操作

    前言: 使用python来读写文件是非常简单的操作,我们使用open()函数来打开一个文件,获取到文件句柄.然后通过文件句柄就可以进行各种操作了,根据打开方式的不同能够执行的操作也会有相应的差异. 打 ...