Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php浮点运算错误?_Php_Floating Accuracy - Fatal编程技术网

php浮点运算错误?

php浮点运算错误?,php,floating-accuracy,Php,Floating Accuracy,总结如下: $a = 213480.7-190.46; exit($a-213290.24); # 2.9103830456734E-11 结果输出假定为0。但它的输出 手术结果的故事: $b is : 213480.7 -190.46 $b is : 213290.24 现在,平衡看起来是正确的。但是当使用比较运算符时。。结果很奇怪 这是var_转储和比较结果 var_dump($b); # float 213290.24 if ($b==213290.24) { exit('s

总结如下:

$a = 213480.7-190.46;
exit($a-213290.24);
# 2.9103830456734E-11
结果输出假定为0。但它的输出

手术结果的故事:

$b is : 213480.7
-190.46
$b is : 213290.24
现在,平衡看起来是正确的。但是当使用比较运算符时。。结果很奇怪 这是var_转储和比较结果

var_dump($b);
# float 213290.24

if ($b==213290.24) {
    exit('same');
} elseif ($b>213290.24) {
    exit('larger '.($b-213290.24));
} else {
    exit('smaller '.($b-213290.24));
}
#larger 2.9103830456734E-11

有谁能告诉我如何解决这个问题吗?

对浮点数值执行的计算总是从它们的机器表示中得到结果。因此,不应使用相等运算符
==
来比较浮点值

典型的方法是确定最小允许误差,并检查要比较的值之间的差异是否小于所需的误差

$min_error = 0.00001;
if (abs($a - $b) < $min_error) 
{
   exit("same");
}
$min_error=0.00001;
如果(abs($a-$b)<$min_错误)
{
退出(“相同”);
}

对浮点数值执行的计算总是由其机器表示产生结果。因此,不应使用相等运算符
==
来比较浮点值

典型的方法是确定最小允许误差,并检查要比较的值之间的差异是否小于所需的误差

$min_error = 0.00001;
if (abs($a - $b) < $min_error) 
{
   exit("same");
}
$min_error=0.00001;
如果(abs($a-$b)<$min_错误)
{
退出(“相同”);
}
参见此处:

所以永远不要相信最后一位的浮点数结果,也永远不要相信 比较浮点数是否相等。如果需要更高的精度 必要的,任意精度的数学函数和gmp函数 都有

处理浮点比较的常用方法是添加一个允许的epsilon,或浮点值中的小差异,因此任何在小公差范围内的内容都被认为是等效的

if (abs(213290.24 - $b) < .001) {
    exit('same')
}
if(abs(213290.24-$b)<.001){
退出(“相同”)
}
参见此处:

所以永远不要相信最后一位的浮点数结果,也永远不要相信 比较浮点数是否相等。如果需要更高的精度 必要的,任意精度的数学函数和gmp函数 都有

处理浮点比较的常用方法是添加一个允许的epsilon,或浮点值中的小差异,因此任何在小公差范围内的内容都被认为是等效的

if (abs(213290.24 - $b) < .001) {
    exit('same')
}
if(abs(213290.24-$b)<.001){
退出(“相同”)
}

这不是php的问题,它与二进制浮点的性质有关。
用浮点数不能准确地表示所有的有理数。例如,您可能尝试比较0.1+0.2==0.3,这将是失败的,因为0.3没有准确表示。

这不是php的问题,它与二进制浮点的性质有关。
用浮点数不能准确地表示所有的有理数。例如,您可能尝试比较0.1+0.2==0.3,这将是失败的,因为0.3没有准确表示。

投票否决?我不明白?是我的问题吗?我没有投反对票,但你已经用答案标记了你的问题:浮动精度。谢谢你帮我找出问题所在。没有解决方案?这取决于你的目标是什么。允许一些转移注意力是通常要做的事(
abs(123.456-$a)<0.002
),但这可能不是你想要的。好的。然后我会尝试其他解决方案。谢谢,投反对票?我不明白?是我的问题吗?我没有投反对票,但你已经用答案标记了你的问题:浮动精度。谢谢你帮我找出问题所在。没有解决方案?这取决于你的目标是什么。允许一些转移注意力是通常要做的事(
abs(123.456-$a)<0.002
),但这可能不是你想要的。好的。然后我会尝试其他解决方案。谢谢