在模型中tax/Sales_Total_Quote_Tax
,有一种_deltaRound()
舍入价格的方法。它增加了一个小的变化量,以在四舍五入时停止不确定的行为。
/**
* Round price based on previous rounding operation delta
*
* @param float $price
* @param string $rate
* @param bool $direction price including or excluding tax
* @param string $type
* @return float
*/
protected function _deltaRound($price, $rate, $direction, $type = 'regular')
{
if ($price) {
$rate = (string)$rate;
$type = $type . $direction;
// initialize the delta to a small number to avoid non-deterministic behavior with rounding of 0.5
$delta = isset($this->_roundingDeltas[$type][$rate]) ? $this->_roundingDeltas[$type][$rate] : 0.000001;
$price += $delta;
$this->_roundingDeltas[$type][$rate] = $price - $this->_calculator->round($price);
$price = $this->_calculator->round($price);
}
return $price;
}
但它存储一个增量。如果找不到这样存储的增量,则将其补足。为什么?就像我所知道的tar一样,使用相同的操作会导致不同的结果。
假设我们的$price
值为3.595,并且没有cached $delta
。通过该方法,我们将获得$ delta = 0.000001。然后$price
,我们得到= 3.595001(四舍五入为3.60),因此我们有了新$delta
的-0.004999。我们返回3.60。
除了现在,我们有一个增量,所以我们用$price
= 3.595 重新做一次。$price
= 3.595-0.004999 = 3.590001
如果四舍五入,我们得到3.59。不同的答案。
在我看来,每次使用相同的参数运行时,任何舍入算法都应至少给出相同的答案,但这次不这样做。