Trong mô hình tax/Sales_Total_Quote_Tax
, có một phương pháp _deltaRound()
làm tròn giá. Nó thêm một delta nhỏ, để ngăn chặn hành vi không xác định khi làm tròn 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;
}
Nhưng nó lưu trữ một đồng bằng. Nếu nó không thể tìm thấy một delta được lưu trữ như vậy, nó tạo nên một delta. Tại sao? Như tar như tôi có thể nói, điều này dẫn đến kết quả khác nhau với các hoạt động giống hệt nhau.
Giả sử chúng ta có $price
3.595 và chúng ta không có bộ nhớ cache $delta
. Khi chúng ta thực hiện phương thức này, chúng ta sẽ thu được $ delta = 0,000001. Sau đó, chúng tôi nhận được $price
= 3.595001, làm tròn đến 3,60, vì vậy chúng tôi có số mới $delta
là -0,004999. Và chúng tôi trả lại 3,60.
Ngoại trừ bây giờ chúng ta có một đồng bằng, vì vậy hãy làm lại, với $price
= 3.595. $price
= 3.595 - 0,004999 = 3.590001
Mà nếu chúng ta làm tròn, chúng ta nhận được 3,59. Câu trả lời khác nhau.
Dường như với tôi, bất kỳ thuật toán làm tròn nào được sử dụng ít nhất nên đưa ra cùng một câu trả lời mỗi khi nó được chạy với cùng một đối số, nhưng không phải lúc này.