मॉडल में 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;
}
लेकिन यह एक डेल्टा को संग्रहीत करता है। यदि उसे ऐसा संग्रहित डेल्टा नहीं मिल सकता है, तो यह एक को बना देता है। क्यों? टार के रूप में मैं बता सकता हूं, यह समान संचालन के साथ अलग-अलग परिणामों की ओर जाता है।
मान लें कि हमारे पास $price
3.595 है, और हमारे पास कैश नहीं है $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 मिलते हैं। अलग-अलग जवाब।
यह मुझे लगता है कि किसी भी राउंडिंग एल्गोरिथ्म का उपयोग कम से कम एक ही जवाब देना चाहिए हर बार एक ही तर्कों के साथ चलाया जाता है, लेकिन इस बार नहीं।