首先,您好,抱歉我的英语。所以我的情况是要防止一种产品的价格相同。例如,我有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;
}
有人可以告诉我我在哪里吗?
答案 0 :(得分:1)
首先,我们需要更正代码。由于if ... else
,您将始终在第一个产品上留下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;
}
还有其他方法可以执行此操作,但是它们基本上都避免了float值中可能出现的细微差别。