Modelde tax/Sales_Total_Quote_Tax
, _deltaRound()
fiyatı yuvarlayan bir yöntem var. 0.5 yuvarlarken belirsiz olmayan davranışı durdurmak için küçük bir delta ekler.
/**
* 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;
}
Ama bir delta depolar. Eğer depolanmış bir deltayı bulamazsa, bir tane oluşturur. Neden? Anlayabildiğim gibi katran olarak, bu aynı işlemlerle farklı sonuçlara yol açar.
Diyelim ki $price
3.595'imiz var ve önbelleğe sahip değiliz $delta
. Bu yöntemden geçerken $ delta = 0.000001 elde edeceğiz. Daha sonra $price
= 3.595001 $delta
alırız. Ve 3.60'a geri dönüyoruz.
Şimdi bir $price
deltamız var , hadi tekrar = 3.595 ile yapalım. $price
= 3.595 - 0.004999 = 3.590001
Hangi yuvarlak yaparsak, 3.59 alırız. Farklı cevaplar.
Bana öyle geliyor ki, kullanılan herhangi bir yuvarlama algoritması en azından aynı argümanlarla her çalıştırıldığında aynı cevabı vermeli, ama bu sefer değil.