php 浮点数比较方法详解浮点数比较方法详解
浮点数运算精度问题浮点数运算精度问题
首先看一个例子:
<?php
$a = 0.1;
$b = 0.9;
$c = 1;
var_dump(($a+$b)==$c);
var_dump(($c-$b)==$a);
?>
$a+$b==$c 返回true,正确
$c-$b==$a 返回false,错误
为什么会这样呢?为什么会这样呢?
运算后,精度为20位时实际返回的内容如下:
<?php
$a = 0.1;
$b = 0.9;
$c = 1;
printf("%.20f", $a+$b); // 1.00000000000000000000
printf("%.20f", $c-$b); // 0.09999999999999997780
?>
$c-$b 为 0.09999999999999997780,因此与0.1比较返回false
出现这个问题是因为浮点数计算涉及精度,当浮点数转为二进制时有可能会造成精度丢失。
浮点数转二进制方法浮点数转二进制方法
整数部分采用除以除以2取余取余方法
小数部分采用乘以乘以2取整取整方法
例如:把数字例如:把数字8.5转为二进制转为二进制
整数部分是整数部分是8
8/2=4 8%2=0
4/2=2 4%2=0
2/2=1 2%2=0
1比2小,因此不需要计算下去,整数8的二进制为 1000
小数部分是小数部分是0.5
0.5×2 = 1.0
因取整后小数部分为0,因此不需要再计算下去
小数0.5的二进制为 0.1
8.5的二进制为1000.1
计算数字计算数字0.9的二进制的二进制
0.9×2=1.8
0.8×2=1.6
0.6×2=1.2
0.2×2=0.4
0.4×2=0.8
0.8×2=1.6
…. 之后不断循环下去,当截取精度为N时,N后的数会被舍去,导致精度丢失。
上例中0.9在转为二进制时精度丢失,导致比较时出现错误。
评论0
最新资源