모델 에는 가격을 반올림하는 tax/Sales_Total_Quote_Tax
방법 _deltaRound()
이 있습니다. 0.5를 반올림 할 때 비 결정적 동작을 중지하기 위해 작은 델타를 추가합니다.
/**
* 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가 있고 캐시가 없다고 가정 해 봅시다 $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를 얻습니다. 다른 답변.
사용 된 모든 반올림 알고리즘은 동일한 인수로 실행될 때마다 적어도 동일한 대답을 제공해야하지만 이번에는 그렇지 않습니다.