जब से मैंने पैसे से निपटने वाले आवेदन लिखे हैं, तब से कुछ समय हो गया है। कई साल पहले, मैं एक पैसा वस्तु बनाउंगा जो पर्दे के पीछे इंटीजर से निपटता था। जब भी राशि कहीं छपी होती, तो वह दशमलव स्थान को सही जगह पर रख देती। यह दशमलव समस्याओं को रोकने के लिए था।

क्या मुझे अभी भी ऐसा करने की ज़रूरत है, या क्या मैं सिर्फ BigDecimal का उपयोग कर सकता हूं? अभी सबसे अच्छा अभ्यास क्या माना जाता है?

1
egervari 24 अप्रैल 2011, 08:45
1
साइड नोट, लेकिन मैं हमेशा इस बारे में उत्सुक रहा हूं (वास्तव में अभी तक इससे निपटना नहीं पड़ा): क्या पैसे के लिए double वास्तव में असुरक्षित है? मैं विश्वास नहीं कर सकता कि राउंडऑफ़ त्रुटियाँ कभी भी सेंट स्तर पर होंगी... क्या कोई ऐसी गणना का उदाहरण साझा करना चाहेगा जिसमें doubles खतरनाक होंगे?
 – 
user541686
24 अप्रैल 2011, 08:47
ऐसी स्थिति पर विचार करें जहां आपके पास दशमलव है जिसे फ़्लोटिंग पॉइंट के साथ बिल्कुल प्रदर्शित नहीं किया जा सकता है। यदि इस दशमलव को वांछित मान से कम उच्चतम मान के रूप में दर्शाया गया था, तो एक तुलना (उदाहरण के लिए balance <= spendingCost) सफल होने पर विफल हो जाएगी।
 – 
corsiKa
24 अप्रैल 2011, 08:51
 – 
sjr
24 अप्रैल 2011, 08:51
1
@glowcoder: लेकिन फिर क्या आप Math.abs(balance - spendingCost) <= EPSILON या ऐसा कुछ नहीं कह सकते? या इससे भी बेहतर, ऑपरेटर ओवरलोडिंग वाली भाषाओं के लिए, बस एक स्ट्रक्चर बनाएं जिसमें double हो और फिर सभी तुलना ऑपरेटरों को ओवरलोड करें; तो आपको struct के बाहर इसके बारे में चिंता करने की ज़रूरत नहीं होगी। क्या हमें वास्तव में दशमलव-आधारित संख्या की आवश्यकता है?
 – 
user541686
24 अप्रैल 2011, 08:51
3
@ मेहरदाद: मैं वित्त में काम करता हूं। "पिछले महीने में इस स्टॉक की औसत कीमत क्या है" जैसी गणना के लिए डबल ठीक है। लेकिन अगर हम अकाउंटिंग के लिए डबल का इस्तेमाल करते हैं, तो हम किसी भी क्लाइंट ड्यू डिलिजेंस टेस्ट को विफल कर देंगे। जोड़ना बुरा है, लेकिन घटाना बदतर है। हमेशा दो दशमलव स्थानों तक गोल करने का आपका विचार (बेशक, आप भूल गए हैं कि म्यूचुअल फंड की स्थिति 4 स्थानों पर गोल होती है, आदि) वास्तव में बिगइंटर के दो स्थानों को स्थानांतरित करने के एक बेकार प्रतिनिधित्व का उपयोग कर रहा है। यह एक सुलझी हुई समस्या है। फ्लोटिंग पॉइंट में अकाउंटिंग न करें।
 – 
Andrew Lazarus
24 अप्रैल 2011, 09:35

1 उत्तर

सबसे बढ़िया उत्तर

यह आपकी आवश्यकताओं पर निर्भर करता है। आपको केवल निकटतम K के समाधान की आवश्यकता हो सकती है (उदाहरण के लिए, नौकरी पोस्टिंग वेबसाइट पर वेतन आवश्यकताएं।)

मान लें कि आपका मतलब है कि आपको ग्रैन्युलैरिटी की आवश्यकता है, BigDecimal नौकरी के लिए बिल्कुल उपयुक्त लगता है। यह लगता है निश्चित रूप से उपयोग करने के लिए "सुरक्षित" है, लेकिन यह जाने बिना कि आप इसके साथ क्या करने की योजना बना रहे हैं, यह निश्चित रूप से कहना मुश्किल है।

1
corsiKa 24 अप्रैल 2011, 08:49
खैर, यह सामान्य ज्ञान है कि एक सादे डबल का उपयोग करने से जोड़ने के साथ भी सरल गणित की समस्याएं होंगी। यह स्वीकार्य नहीं है। यदि आप BigDecimal के साथ समान समस्याओं का सामना करते हैं, तो मैं उत्सुक था। एक इंट का उपयोग करना कोई बड़ी बात नहीं है - मैं कर सकता हूँ। मुझे इतनी परवाह नहीं है। लेकिन अगर मैं सिर्फ BigDecimal का उपयोग करके अपने कोड को सरल बना सकता हूं, तो मुझे वास्तव में यह पसंद आएगा। समय बचाता है।
 – 
egervari
24 अप्रैल 2011, 08:57
1
BigDecimal "उन समस्याओं" से बचने के एकमात्र उद्देश्य के लिए प्रदान किया जाता है, जैसा कि मैंने कहा, सामान्य स्थिति में हाँ मैं कहूंगा कि यह ठीक है। लेकिन यह संभव है कि आप कुछ ऐसा कर रहे हैं जिसे BigDecimal संभालने के लिए तैयार नहीं है। BigDecimal हर पैसे के आवेदन के लिए ठीक है जिसे मैं अपने सिर के ऊपर से सोच सकता हूं।
 – 
corsiKa
24 अप्रैल 2011, 08:59