Php 如何通过递归找到正确的价格?

Php 如何通过递归找到正确的价格?,php,recursion,Php,Recursion,首先,你好,对不起,我的英语。所以我的理由是防止一种产品的价格相同。例如,我有3家供应商提供相同的产品,但价格不同 product 1 - 12 USD product 1 - 12.1 USD product 1 - 55 USD 如果我的价格是55,我想设置12,程序应该设置12.2。原因12和12.1已被采用。 实际上,我需要找到最接近的,不采取步骤0.1的价格 我的代码不起作用: public function findCorrectClosestPrice($price, $prod

首先,你好,对不起,我的英语。所以我的理由是防止一种产品的价格相同。例如,我有3家供应商提供相同的产品,但价格不同

product 1 - 12 USD
product 1 - 12.1 USD
product 1 - 55 USD
如果我的价格是55,我想设置12,程序应该设置12.2。原因12和12.1已被采用。 实际上,我需要找到最接近的,不采取步骤0.1的价格

我的代码不起作用:

public function findCorrectClosestPrice($price, $products)
    {
        foreach ($products as $product)
        {
            if ($product->price === $price)
            {
                $price = $price + 0.1;
                return $this->findCorrectClosestPrice($price, $products);
            }
            else
            {
                return $price + 0.1;
            }
        }

        return null;
    }

有人能告诉我错误在哪里吗?

首先我们需要更正代码。因为<代码>如果。。。否则,您将始终在第一个产品上保留
foreach
循环和功能

public function findCorrectClosestPrice($price, $products)
{
    foreach ($products as $product)
    {
        if ($product->price === $price)
        {
            $price = $price + 0.1;
            return $this->findCorrectClosestPrice($price, $products);
        }
    }
    return $price + 0.1;
}
但是您也在处理浮点数,并且使用了
=
相同的比较运算符。这可能行不通。简言之:

0.1 + 0.1 === 0.2
可能返回false,因为两侧的浮点值不完全相同

解决办法并不难,只要容忍一点点差别就行了。您可以这样做:

public function findCorrectClosestPrice($price, $products)
{
    foreach ($products as $product)
    {
        if (abs($product->price - $price) < 0.0001)
        {
            $price = $price + 0.1;
            return $this->findCorrectClosestPrice($price, $products);
        }
    }
    return $price + 0.1;
}
公共函数查找正确的关闭价格($price,$products)
{
foreach($products as$product)
{
如果(abs($product->price-$price)<0.0001)
{
$price=$price+0.1;
返回$this->findCorrectClosestPrice($price,$products);
}
}
返回$price+0.1;
}

还有其他方法可以做到这一点,但它们基本上都避免了浮点值中可能出现的细微差异。

谢谢!在比较中,我使用round()函数更改了它。如果(round($product->price,1)=round($price,1))是的,
round()
也可以工作,但请记住,在这种情况下,您仍然可以直接比较两个浮点数。这可能会奏效,但相当危险。你可以乘以10,然后把这个数字变成一个整数。这是一种比较数字的安全方法,无需使用阈值。