Dalam model tax/Sales_Total_Quote_Tax
, ada metode _deltaRound()
yang membulatkan harga. Ini menambah delta kecil, untuk menghentikan perilaku nondeterministik ketika membulatkan 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;
}
Tapi itu menyimpan delta. Jika tidak dapat menemukan delta yang disimpan, itu membuatnya. Mengapa? Seperti yang saya tahu, ini mengarah ke hasil yang berbeda dengan operasi yang identik.
Katakanlah kita memiliki $price
3.595, dan kita tidak memiliki cache $delta
. Saat kita melalui metode ini, kita akan mendapatkan $ delta = 0,000001. Kami kemudian mendapatkan $price
= 3,595001, yang membulatkan ke 3,60, jadi kami memiliki yang baru $delta
sebesar -0,004999. Dan kami mengembalikan 3,60.
Kecuali sekarang kita memiliki delta jadi mari kita lakukan lagi, dengan $price
= 3,595. $price
= 3,595 - 0,004999 = 3,590001
Yang jika kita bulat, kita mendapat 3,59. Jawaban berbeda.
Menurut saya, algoritma pembulatan apa pun yang digunakan setidaknya harus memberikan jawaban yang sama setiap kali dijalankan dengan argumen yang sama, tetapi tidak kali ini.