简单谈谈php浮点数精确运算

bc是Binary Calculator的缩写。bc*函数的参数都是操作数加上一个可选的 [int scale],比如string bcadd(string $left_operand, string $right_operand[, int $scale]),如果scale没有提供,就用bcscale的缺省值。这里大数直接用一个由0-9组成的string表示,计算结果返回的也是一个 string。

bcadd — 将两个高精度数字相加
bccomp — 比较两个高精度数字,返回-1, 0, 1
bcdiv — 将两个高精度数字相除
bcmod — 求高精度数字余数
bcmul — 将两个高精度数字相乘
bcpow — 求高精度数字乘方
bcpowmod — 求高精度数字乘方求模,数论里非常常用
bcscale — 配置默认小数点位数,相当于就是Linux bc中的”scale=”
bcsqrt — 求高精度数字平方根
bcsub — 将两个高精度数字相减

首先看一段代码:

<?php
$a = 0.1;
$b = 0.7;
var_dump(($a + $b) == 0.8);

打印出来的值居然为 boolean false

这是为啥?PHP手册对于浮点数有以下警告信息:

Warning
浮点数精度
显然简单的十进制分数如同 0.1 或 0.7 不能在不丢失一点点精度的情况下转换为内部二进制的格式。这就会造成混乱的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999...。
这和一个事实有关,那就是不可能精确的用有限位数表达某些十进制分数。例如,十进制的 1/3 变成了 0.3333333. . .。
所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数或者 gmp 函数

那么上面的算式我们应该改写为

<?php
$a = 0.1;
$b = 0.7;
var_dump(bcadd($a,$b,2) == 0.8);

这样就能解决浮点数的计算问题了

(0)

相关推荐

  • PHP中计算字符串相似度的函数代码

    similar_text - 计算两个字符串的相似度 int similar_text ( string $first , string $second [, float &$percent ] ) $first 必需.规定要比较的第一个字符串. $second 必需.规定要比较的第二个字符串. $percent 可选.规定供存储百分比相似度的变量名. 两个字符串的相似程度计算依据 Oliver [1993] 的描述进行.注意该实现没有使用 Oliver 虚拟码中的堆栈,但是却进行了递归调用,这

  • PHP高精确度运算BC函数库实例详解

    本文实例讲述了PHP高精确度运算BC函数库.分享给大家供大家参考,具体如下: <?php /*************************************************************************************** *php BC高精确度函数库 *php bc math 包含了:相加,比较,相除,相减,求余,相乘,n次方,配置默认小数点数目,求平方 *这些函数在涉及到有关金钱的计算时比较有用 **************************

  • PHP中浮点数计算比较及取整不准确的解决方法

    浮点数计算结果比较 一则浮点数计算例子如下: 复制代码 代码如下: $a = 0.2+0.7; $b = 0.9; var_dump($a == $b); 打印出的结果是:bool(false).也就是说在这里 0.2+0.7 的计算结果与 0.9 并不相等,这显然是有违我们的常识的. 对此问题,PHP官方手册曾又说明:显然简单的十进制分数如 0.2 不能在不丢失一点点精度的情况下转换为内部二进制的格式.这和一个事实有关,那就是不可能精确的用有限位数表达某些十进制分数.例如,十进制的 1/3 变

  • PHP数学运算与数据处理实例分析

    本文实例讲述了PHP数学运算与数据处理方法.分享给大家供大家参考,具体如下: 一.数值数据类型 PHP中,数字或数值数据以及数学函数的使用很简单.基本来说,要处理两种数据类型:浮点数和整数.浮点数和整数值的内部表示分别是C数据类型double和int.类似于C,PHP中这些数据类型遵循同样的一组规则. PHP是一种松散类型的脚本语言,变量可以根据计算的需求改变数据类型.这就允许引擎动态地完成类型转换.所以,如果计算中包含数值和字符串,字符串会在完成计算之前转换为数值,而数值则会在与字符串连接之前

  • 在php和MySql中计算时间差的方法

    最近在研究自己爱围脖的时候就要计算到恋爱天数,这需要php根据每天的日期进行计算,下面就来谈谈实现这种日期计算的几种方法: (1) 如果有数据库就很容易了!若是MSSQL可以使用触发器!用专门计算日期差的函数datediff()便可! 若是MYSQL那就用两个日期字段的差值计算的计算结果保存在另一个数值型字段中!用时调用便可! (2)如果没有数据库,那就得完全用php的时间日期函数! 下面主要说明之: 例:计算1998年5月3日到1999-6-5的天数: 复制代码 代码如下: $startdat

  • php学习之简单计算器实现代码

    复制代码 代码如下: <html> <head> <title>PHP实现简单计算器</title> <meta http-equiv="Content-Type" content="text/html;charset=gb2312"> </head> <?php //单路分支 if(isset($_GET["sub"])) { $num1=true;//数字1是否为空

  • php常用数学函数汇总

    本文实例汇总并分析了php常用数学函数.分享给大家供大家参考.具体分析如下: abs()函数定义和用法: 返回一个数的绝对值. 语法:abs(x),代码如下: 复制代码 代码如下: $abs=abs(-3.2);      //$abs=3.2 $abs2=abs(5);       //$abs2=5 $abs3=abs(-5);       //$abs3=5 ceil()函数定义和用法:向上舍入为最接近的整数. 语法ceil(x) 参数 描述 x 必需,一个数. 说明:返回不小于 x 的下

  • PHP四舍五入精确小数位及取整

    进一法取整.四舍五入取整.忽略小数等的取整数方法大全 PHP取整数函数常用的四种方法,下面收集了四个函数:经常用到取整的函数,今天小小的总结一下!其实很简单,就是几个函数而已--主要是:ceil,floor,round,intval PHP取整数函数常用的四种方法,下面收集了四个函数:经常用到取整的函数,今天小小的总结一下!其实很简单,就是几个函数而已--主要是:ceil,floor,round,intval 一.ceil - 进一法取整 说明float ceil ( float value )

  • PHP使用数组实现矩阵数学运算的方法示例

    本文实例讲述了PHP使用数组实现矩阵数学运算的方法.分享给大家供大家参考,具体如下: 矩阵运算就是对两个数据表进行某种数学运算,并得到另一个数据表. 下面的例子中我们创建了一个基本完整的矩阵运算函数库,以便用于矩阵操作的程序中. 来自 PHP5 in Practice  (U.S.)Elliott III & Jonathan D.Eisenhamer <?php // A Library of Matrix Math functions. // All assume a Matrix de

  • PHP精确计算功能示例

    本文实例讲述了PHP精确计算功能.分享给大家供大家参考,具体如下: 引言:一定要确保数据的准确性.这是一个好的程序员的基本素养. <?php /** * 精确加法 * @param [type] $a [description] * @param [type] $b [description] */ function math_add($a,$b,$scale = '2') { return bcadd($a,$b,$scale); } /** * 精确减法 * @param [type] $a

  • php计算几分钟前、几小时前、几天前的几个函数、类分享

    一.函数实现实例1: 复制代码 代码如下: function time_tran($the_time){   $now_time = date("Y-m-d H:i:s",time()+8*60*60);   $now_time = strtotime($now_time);   $show_time = strtotime($the_time);   $dur = $now_time - $show_time;   if($dur < 0){    return $the_ti

随机推荐