今天在项目中遇到一个奇怪的问题,经过计算后的double类型的变量的值相等的两个变量进行比较,结果却是不相等。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<?php $a =42735.04;
$b =17806.2;
$c = $a /36;
$c = round ( $c ,2);
$d = $c *15;
echo '$b value is: ' . $b . "\n" ;
echo '$d value is: ' . $d . "\n" ;
if ( $b == $d ){
echo "ok\n" ;
} else {
echo "sorry\n" ;
} |
得到结果如下图,明明两个变量的值是一样的,做'=='比较运算却返回false
原因是php7中的浮点数 经过 /,*,round()等一系列运算后,精度发生了变化。
解决方案:将任意精度的变量作为字符串进行比较。
php7中已经提供较好的解决方案.
1
2
3
4
5
6
|
(PHP 4, PHP 5, PHP 7) bccomp — 比较两个任意精度的数字
说明 int bccomp ( string $left_operand , string $right_operand [, int $scale = int
] )
把right_operand和left_operand作比较, 并且返回一个整数的结果. |
最终使用bccomp()来进行比较解决问题
1
2
3
4
5
6
|
if ( bccomp ((string) $b ,(string) $d ,2) === 0){
echo "yes \n" ;
} else {
echo "no \n" ;
} |
本文转自 hgditren 51CTO博客,原文链接:http://blog.51cto.com/phpme/1947237,如需转载请自行联系原作者