Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/230.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_Math_Floating Point - Fatal编程技术网

如何在PHP中解决这个问题?

如何在PHP中解决这个问题?,php,math,floating-point,Php,Math,Floating Point,它输出false,但我们都知道:5/3+1/3=2=3/2+1/2 如何解决此问题?此问题源于由引入的小错误。这不是特定于PHP的 您可以通过引入一个小的“容差”因子来解决这个问题,即通过检查比较中的第一个值>=第二个值减去容差,这是IEEE 754浮点数表示法的问题之一;这些表示不够精确,无法表示所有有理数 方法是将差异与非常小的数字进行比较,以确定接近度,而不是相等: $onethird = 1.0/3; $fivethirds = 1.0/3+1.0/3+1.0/3+1.0/3+1.0/3

它输出
false
,但我们都知道:
5/3+1/3=2=3/2+1/2


如何解决此问题?

此问题源于由引入的小错误。这不是特定于PHP的


您可以通过引入一个小的“容差”因子来解决这个问题,即通过检查比较中的第一个值>=第二个值减去容差,这是IEEE 754浮点数表示法的问题之一;这些表示不够精确,无法表示所有有理数

方法是将差异与非常小的数字进行比较,以确定接近度,而不是相等:

$onethird = 1.0/3;
$fivethirds = 1.0/3+1.0/3+1.0/3+1.0/3+1.0/3;
$half = 1.0/2;
$threehalf = 1.0/2+1.0/2+1.0/2;
var_dump($onethird + $fivethirds == $half + $threehalf);
abs($onethird+$fivethird)-($half+$threehalf))<1e-8

这取决于你的比较应该有多精确
在这种情况下,应该使用bccomp()而不是“=”
参见

自从我2000年毕业以来,每年这个时候都会有一些新手在一些新闻组、论坛或邮件列表上问这个问题,这真是令人恼火。就在上个月,我在comp.lang.tcl上回答了这个问题。这不仅仅是新手,两个月前我不得不向我的同事解释这一点,他已经开发了5年多的软件,问我为什么他的Perl代码不起作用

如何解决这个问题

你想解决什么实际问题?您的代码只是显示浮点数字的精度有限-这并不是什么新鲜事

对于大多数实际应用程序,输入并非100%准确,结果只需精确到小数点后几位。平等比较并不是你大多数时候都需要的东西。如果你这样做了,你可以通过查看结果是否在某个预定义的小距离内,从一个给定的数字来伪造它


如果您需要具有特定精度的十进制数学,请使用这些函数,但要知道,如果用于复杂的计算,这些函数的速度会非常慢。

这是浮点数的本质,那么它与IEEE 754标准有什么关系呢?PHP是用C编写的,因此从中获得了FP支持,大多数C运行时使用IEEE 754。此外,IEEE 854使用可变基数,因此可以支持某些数字的更高精度,但在使用这些数字进行计算时会牺牲一些处理速度。这通常是浮点数字的本质。epsilon的值(此处为0.00000000 1)取决于表示浮点的位数。
abs(($onethird + $fivethirds) - ($half + $threehalf)) < 1e-8
var_dump(abs($onethird + $fivethirds - $half + $threehalf) < 0.00001);
if ($float1 =~= $float2) {...