2016-06-03 8 views
5

मैं निश्चित बिंदु बिंदुओं पर संचालन करने के लिए PHP की bcmath लाइब्रेरी का उपयोग कर रहा हूं। मैं पायथन के Decimal वर्ग के समान व्यवहार प्राप्त करने के लिए उम्मीद कर रहा था, लेकिन मैं काफी निम्नलिखित व्यवहार के बजाय आश्चर्य हुआ:PHP बीसीएमएथ बनाम पायथन डेसिमल

// PHP: 
$a = bcdiv('15.80', '483.49870000', 26); 
$b = bcmul($a, '483.49870000', 26); 
echo $b; // prints 15.79999999999999999999991853 

अजगर में Decimal रों का उपयोग करते समय मैं:

# Python: 
from decimal import Decimal 
a = Decimal('15.80')/Decimal('483.49870000') 
b = a * Decimal('483.49870000') 
print(b) # prints 15.80000000000000000000000000 

क्यों कि है ? चूंकि मैं इसका उपयोग बहुत संवेदनशील संचालन करने के लिए कर रहा हूं, इसलिए मैं पीएचथॉन (यानी (x/y) * y == x)

+0

हाँ:

function bcdiv_round($first, $second, $scale = 0, $round=PHP_ROUND_HALF_EVEN) { return (string) round(bcdiv($first, $second, $scale+1), $scale, $round); } function bcmul_round($first, $second, $scale = 0, $round=PHP_ROUND_HALF_EVEN) { $rounded = round(bcmul($first, $second, $scale+1), $scale, $round); return (string) bcmul('1.0', $rounded, $scale); } 

यहाँ एक प्रदर्शन है '483.4 9 80000', 26); गूंज गेट टाइप ($ ए); 'प्रिंट्स" स्ट्रिंग " –

+0

कौन सा सही है, बीटीडब्ल्यू? – Will

उत्तर

4

कुछ प्रयोगों के बाद, मुझे यह पता चला कि PHP में प्राप्त करने का एक तरीका खोजना है। यह गोलाकार बनाम छिड़काव के साथ एक मुद्दा है। डिफ़ॉल्ट रूप से पाइथन ROUND_HALF_EVEN राउंडिंग का उपयोग करता है, जबकि PHP बस निर्दिष्ट परिशुद्धता पर छंटनी करता है। पाइथन में 28 की डिफ़ॉल्ट सटीकता भी है, जबकि आप PHP में 26 का उपयोग कर रहे हैं। बनाना अजगर के डिफ़ॉल्ट की तरह पीएचपी व्यवहार थोड़ा जटिल काम है

In [1]: import decimal 
In [2]: decimal.getcontext().rounding = decimal.ROUND_DOWN 
In [3]: decimal.getcontext().prec = 28 
In [4]: a = decimal.Decimal('15.80')/decimal.Decimal('483.49870000') 
In [5]: b = a * decimal.Decimal('483.49870000') 
In [6]: print(b) 
15.79999999999999999999999999 

:

In [57]: import decimal 
In [58]: decimal.getcontext() 
Out[58]: Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999999, Emax=999999999, capitals=1, flags=[], traps=[InvalidOperation, Overflow, DivisionByZero]) 

आप अजगर काट-छांट के PHP के व्यवहार की नकल बनाना चाहते हैं, हम बस संपत्ति को बदलने की जरूरत। हम विभाजन और गुणा के लिए एक कस्टम समारोह बनाने की जरूरत है कि राउंड अजगर की तरह "भी आधा",:, `$ एक = bcdiv ('15 .80 ':

php > $a = bcdiv_round('15.80', '483.49870000', 28); 
php > $b = bcmul_round($a, '483.49870000', 28); 
php > var_dump($b); 
string(5) "15.80" 
+1

आपके महान उत्तर के लिए बहुत बहुत धन्यवाद! –

+0

कोई समस्या नहीं, मदद करने में खुशी :) – Will

संबंधित मुद्दे