关于浮点型的运算---比较

Posted xiaommvik

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于浮点型的运算---比较相关的知识,希望对你有一定的参考价值。

1.常见问题

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

打印出来的值居然为 boolean false

printf("%.20f", $a);

printf("%.20f", $b);

0.10000000000000000555

0.69999999999999995559

显然是不相等的。

对于常用金额数据比较

    $a = 456;

    $b = 4.56;

    $a  == $b*100 是不成立的

printf("%.20f", $a);
printf("%.20f", $b*100);
456.00000000000000000000
455.99999999999994315658

    显然也是不成立的  

2.解决办法(总结的以下方式)

1)bccomp ( string $left_operand , string $right_operand [, int $scale = int ] ) 高精度的比较两个浮点数(字符串)

    如果两个数相等返回0, 左边的数left_operand比较右边的数right_operand大返回1, 否则返回-1.

2)

$scale = 0.00001

$a = 0.6995559;

$b = 0.6995552;

$a - $b < $scale   $scale 小数点后5位比较

$a == $b

3)$a /100 == $b;

    相同小数是相同的

 

 

 

以上是关于关于浮点型的运算---比较的主要内容,如果未能解决你的问题,请参考以下文章

快速浮点开方运算

C语言中,一个整型对一个浮点型取余是怎样运算的?

php的精度计算问题(bcadd和bcsub)

C语言关于浮点转换运算的问题

浮点运算潜在的结果不一致问题

关于金额,重量等浮点数的数据库字段设计(用Int,Long代替浮点数计算)