মডেলটিতে 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 পেয়ে যাব। বিভিন্ন উত্তর।
আমার কাছে মনে হয় যে কোনও গোলাকার অ্যালগরিদম ব্যবহার করা হয়েছে কমপক্ষে প্রতিটি সময় একই যুক্তি দিয়ে চালানো উচিত, তবে এবার নয়।