浮点数计算结果的比较
浮点数的一个例子如下:
复制代码代码如下所示:
$ = 0.2 + 0.7;
$ = 0.9;
var_dump($ = $ B);
打印的结果是:bool(假)。也就是说,0.2 + 0.7的计算结果不等于0.9,这显然违背了我们的常识。
对于这个问题,PHP官方手册解释了一遍:很显然,一个简单的小数,如0.2,不能
转换为内部二进制格式不失去一点点的准确性。这是事实,这是不可能准确地用有限位数表达一定的小数相关。例如,小数1 / 3变成0 3333333…
我们以双精度格式打印上述变量:
复制代码代码如下所示:
$ = 0.2 + 0.7;
$ = 0.9;
printf(% 0.20f
回声';
printf(% 0.20f
输出结果如下:
复制代码代码如下所示:
0.89999999999999991118
0.90000000000000002220
很明显,事实上,如浮点数据,其精度已失去了它的一部分,是不完全准确的。所以不要相信浮点数的结果精确到最后,不比较两个浮点数是否相等。需要说明的是,这不是PHP的问题,但问题
处理浮点数在
计算机内部!同样的问题也会在如C
语言中,java和其他语言。
因此,为了比较两个浮点数,我们需要在我们需要的精度范围内
控制它们,然后比较它们。所以我们用bcadd()
函数来添加和变换浮点数精度为字符串。
复制代码代码如下所示:
var_dump(bcadd(0.2,0.7,1)= = 0.9); / /输出:bool(真的)
浮点数舍入
在PHP细胞层,在
文本的整体
功能,有实例:
复制代码代码如下所示:
< PHP
回声细胞(2.1/0.7); / /输出:4
>
在浮点数的计算之后,我们知道这并不完全是浮点数计算结果的结果。
复制代码代码如下所示:
< PHP
printf(% 0.20f (2.1 / 0.7)); / /输出:3.00000000000000044409
>
在讨论浮点数的计算之后,我们知道这是浮点数不完全计算结果引起的,因此我们可以用圆函数来处理它。
复制代码代码如下所示:
< PHP
回声细胞(圆((((2.1 / 0.7),1));
>
虽然圆()函数按照指定的精度是四到五个舍,但保留小数点,对舍入结果没有
影响。