今天在项目中遇到一个奇怪的问题,经过计算后的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,如需转载请自行联系原作者