2010-04-02 10 views
51

मैं उत्सुक जो एक एक मुद्रा क्षेत्र के रूप में बेहतर फिटिंग होगा हूँ? मैं सरल संचालन करूँगा जैसे अंतर लेना, पुरानी और नई कीमतों के बीच का प्रतिशत। मैं शून्य के बाद दो अंकों (यानी 10.50) रखने की योजना बना रहा हूं और अधिकांश समय शून्य होने पर, मैं इन नंबरों को छुपाऊंगा और इसे "10"Django: मुद्रा के लिए FloatField या DecimalField?

ps: मुद्रा डॉलर आधारित नहीं है :)

उत्तर

89

हमेशा पैसे के लिए DecimalField का उपयोग करें।

>>> 10.50 - 0.20 
10.300000000000001 

>>> Decimal('10.50') - Decimal('0.20') 
Decimal('10.30') 
+4

'>> 10.50 - 0.20' पायथन 2.7 में '10.3' प्राप्त करें। – Rockallite

+0

वेल्प, बकवास। मैं अपने फ्लोटफिल्ड फ़ील्ड/कॉलम से दशमलव डेटा को बहुत से डेटा माइग्रेट कर दूंगा ... – teewuane

+0

हाई टाइम में हमारे पास "पैसे के लिए फ़्लोटिंग पॉइंट का उपयोग न करें" बॉबन्स के http://stackoverflow.com/a/1732454/ 604511 – aitchnyu

6

संपादित करें: Satchmo परियोजना अब सक्रिय नहीं है, तो मुद्रा

    से निपटने के लिए इन विकल्पों पर एक नज़र डालें यहां तक ​​कि साधारण संचालन (इसके अलावा, घटाव) नहीं राउंडिंग मुद्दों फ्लोट करने के लिए प्रतिरक्षा हैं
  • Django Money
  • Oscar

Django आधारित Satchmo Project एक CurrencyField और CurrencyWidget कि पर एक नज़र लेने लायक हैं है। स्रोत

32

प्रश्न का उत्तर satchmo_utils एप्लिकेशन निर्देशिका बाहर

चेक सही है, लेकिन कुछ उपयोगकर्ताओं DecimalField और FloatField के बीच अंतर पता लगाने के लिए इस प्रश्न पर ठोकर होगा। फ्लोट राउंडिंग मुद्दा सेठ लाता है मुद्रा के लिए एक समस्या है।

DecimalField:

  • DecimalFields एक 'decimal_places' और एक 'max_digits' विशेषता को परिभाषित करना होगा

    Django डॉक्स स्टेट्स

    The FloatField class is sometimes mixed up with the DecimalField class. Although they both represent real numbers, they represent those numbers differently. FloatField uses Python’s float type internally, while DecimalField uses Python’s Decimal type. Read more here .

    यहाँ दो क्षेत्रों के बीच अन्य मतभेद हैं।

  • आपको उपरोक्त आवश्यक विशेषताओं से यहां दो मुक्त फॉर्म सत्यापन शामिल हैं, यानी यदि आप max_digits को 4 पर सेट करते हैं, और आप 4.00000 (5 अंक) वाले दशमलव में टाइप करते हैं, तो आपको यह त्रुटि मिल जाएगी: सुनिश्चित करें कि कोई नहीं है कुल में 4 से अधिक अंक।
  • आपको दशमलव स्थानों के लिए भी एक समान फॉर्म सत्यापन प्राप्त होता है (जो अधिकांश ब्राउज़रों में इनपुट फ़ील्ड पर चरण विशेषता का उपयोग करके फ्रंट एंड पर भी मान्य होगा। यदि आप दशमलव_प्लेस = 1 सेट करते हैं और 0.001 में उस मान के रूप में टाइप करते हैं जो आप करेंगे कि न्यूनतम मूल्य 0.1 हो गया है एक त्रुटि
  • रिटर्न एक decimal.Decimal मिलता है।, प्रकार
  • DecimalField
  • के रूप में अतिरिक्त सत्यापन की जरूरत नहीं है एक दशमलव प्रकार के साथ है, राउंडिंग भी कारण के लिए आप के लिए नियंत्रित किया जाता है आवश्यक गुण जो उपरोक्त वर्णित अनुसार सेट किए जाने की आवश्यकता है। इसलिए खोल से, यदि आप
  • डेटाबेस (postgresql) में, DecimalField सहेज रहा है घ एक अंकीय (max_digits, decimal_laces) के रूप में टाइप करें, और भंडारण के रूप में "मुख्य" सेट है, से उपरोक्त उदाहरण प्रकार संख्यात्मक (4,1) है

DecimalField from the Django Docs पर अधिक।

FloatField:

  • रिटर्न, नाव प्रकार में बनाया
  • कोई स्मार्ट राउंडिंग, और वास्तव में Seths जवाब में वर्णित के रूप मुद्दों गोलाई हो सकती है।
  • कि आप DecimalField
  • से प्राप्त डेटाबेस (PostgreSQL) में अतिरिक्त फ़ॉर्म सत्यापन, FloatField एक "डबल परिशुद्धता" प्रकार के रूप में सहेजा जाता है, और भंडारण के रूप में "सादे"
सेट कर दिया जाता है नहीं है

FloatField from the Django Docs पर अधिक।

दोनों पर लागू होता है:

  • दोनों क्षेत्रों "फील्ड" वर्ग से विस्तार करने और 'खाली', 'अशक्त', 'verbose_name', 'नाम' स्वीकार कर सकते हैं, 'primary_key', 'MAX_LENGTH', 'अद्वितीय', 'db_index', 'rel', 'default', 'संपादन योग्य', 'serialize', 'unique_for_date', 'unique_for_month', 'unique_for_year', 'विकल्प', 'help_text', 'db_column', 'db_tablespace' ',' auto_created ',' validators ',' error_messages 'विशेषताएँ, क्योंकि "फ़ील्ड" से विस्तारित सभी फ़ील्ड होंगे।
  • दोनों फ़ील्ड के लिए डिफ़ॉल्ट फॉर्म विजेट एक टेक्स्ट इनपुट है।

मैं जब दो क्षेत्रों के बीच अंतर की तलाश में तो मुझे लगता है यह एक ही स्थिति :)

अद्यतन में उन लोगों में मदद मिलेगी इस सवाल में आए: इस सवाल का जवाब करने के लिए, मुझे लगता है कि आप प्राप्त कर सकते हैं या तो मुद्रा का प्रतिनिधित्व करने के लिए, हालांकि दशमलव एक बेहतर फिट है। जब यह फ़्लोट की गणना करता है तो एक गोलाकार मुद्दा होता है ताकि आपको अपने फ़्लोट प्रतिनिधित्व को दो दशमलव स्थानों पर गोल रखने के लिए round(value, 2) का उपयोग करना पड़े। यहां एक त्वरित उदाहरण दिया गया है:

>>> round(1.13 * 50 + .01, 2) 
56.51 

आप अभी भी फ्लोट और राउंड के साथ परेशानी में पड़ सकते हैं। यहाँ की तरह हम इसे 5 के एक मूल्य पर नीचे दौर देखें:

>>> round(5.685, 2) 
5.68 

लेकिन इस मामले में, यह दौर होगा:

>>> round(2.995, 2) 
3.0 

यह है सब के साथ क्या करने के लिए कैसे नाव स्मृति में संग्रहीत किया जाता है । here देखें।

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