Nel modello tax/Sales_Total_Quote_Tax
esiste un metodo _deltaRound()
che arrotonda un prezzo. Aggiunge un piccolo delta, per fermare il comportamento non deterministico quando si arrotondano 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;
}
Ma memorizza un delta. Se non riesce a trovare un delta così memorizzato, ne crea uno. Perché? Per quanto posso dire, questo porta a risultati diversi con operazioni identiche.
Diciamo che abbiamo un $price
3.595 e non abbiamo un cache $delta
. Seguendo il metodo, otterremo $ delta = 0,000001. Otteniamo quindi $price
= 3.595001, che arrotondano a 3.60, quindi abbiamo un nuovo $delta
di -0.004999. E torniamo 3.60.
Tranne ora che abbiamo un delta, quindi facciamolo di nuovo, con $price
= 3.595. $price
= 3.595 - 0.004999 = 3.590001
Che se arrotondiamo otteniamo 3,59. Risposte diverse.
Mi sembra che qualsiasi algoritmo di arrotondamento utilizzato dovrebbe almeno dare la stessa risposta ogni volta che viene eseguito con gli stessi argomenti, ma non questa volta.