php 浮点数比较大小问题

作者: jaclon 分类: Linux, PHP 发布时间: 2013-01-11 12:32 ė 6没有评论

最近在开发中遇到这样的问题,两个看起来一样的浮点数,比较却不相等,案例如下

$a = 18888.22;
$b = 988.22;
$c = 19876.44;
$aa = (float)$a;
$bb = (float)$b;
$cc = (float)$c;
$dd = $aa + $bb;

echo $cc, "\r\n";
echo $dd, "\r\n";
var_dump($cc == $dd);

output: 19876.44
output: 19876.44
output: bool(false)

好在php提供了比较两个任意精度的函数
int bccomp ( string $left_operand , string $right_operand [, int $scale ] )
其中$scale表示比较小数的位数

在服务器上可能没有这个模块(bcmath),安装这个模块的方法如下
一般情况下PHP源码包中已经存在这个模块,没有的话只能去网站上下载了

cd /home/software/php/ext/bcmath
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config 
make && make install 

安装完后要在php.ini中加入这个扩展,并重启apache

vim php.ini 
extension=bcmath.so

service http restart

如果是虚拟机的话,可以自定义一个类似功能的方法

if(!function_exists('bccomp')) {
  function bccomp($left_operand, $right_operand, $scale = null){
    if($scale == null){
      $left_operand = floor($left_operand);
      $right_operand = floor($right_operand);
    } else {
      $m = pow(10, intval($scale));
      $left_operand = intval(strval($left_operand * $m));
      $right_operand = intval(strval($right_operand * $m));
    }
    
    return $left_operand == $right_operand ? 0 : ($left_operand > $right_operand ? 1 : -1);
  }
}

这个方法作了简单测试,如有任何问题请指教

本文出自 肥蕉博客@IT技术,热门话题,生活随笔,美图欣赏,转载时请注明出处及相应链接。

本文永久链接: http://www.bananawolf.com/html/2013/01/896.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*

Ɣ回顶部