2011-09-02 14 views
25

मैं जावा में एक बहुत ही सरल प्रभाग है (यह एक उत्पाद की मात्रा प्रति घंटे/उत्पादन है), लेकिन जब भी मैं इस विभाजन कर रहा अजीब त्रुटियों मिलती है:पूर्णांक विभाजन कोड गलत जवाब क्यों देता है?

float res = quantity/standard; 

मैं कई मूल्यों और मैं हमेशा के साथ ऊपर विभाजन की कोशिश की है

हर जगह दुनिया में: त्रुटियों मिलता है, लेकिन एक है कि मैं अन्य सभी स्थानों की कोशिश की और मिल गया है सही यह था

13.6 = 6800/500; 

जावा:

13.0 = 6800/500; 

मैं BigDecimal गौर किया है और BigInteger, हालांकि मैं उनके साथ इस विभाजन को बनाने के लिए एक तरह से नहीं मिला है, वहाँ परिशुद्धता त्रुटियों बिना जावा में इस विभाजन करने के लिए किसी अन्य तरीके से है ??

किसी भी मदद की बहुत सराहना की जाएगी।

+8

"हर जगह दुनिया में" आप शाब्दिक ;-) का मूल्य पुन: असाइन नहीं कर सकते –

+0

आप 'double' जब तक' नाव का उपयोग करने के लिए एक विशिष्ट आवश्यकता है का उपयोग करना चाहिए '। – starblue

+3

"दुनिया में हर जगह" सी, सी ++ को छोड़ देता है? – djechlin

उत्तर

71

आप पूर्णांक को विभाजित कर रहे हैं, जिसका अर्थ है कि आप पूर्णांक विभाजन का उपयोग कर रहे हैं।

पूर्णांक विभाजन में परिणाम का आंशिक हिस्सा फेंक दिया जाता है।

float res = (float) quantity/standard; 
      ^^^^^^^ 

ऊपर बलों अंश एक float जो बारी में रूप में अच्छी तरह फ्लोट करने के लिए विभाजक को बढ़ावा देता है के रूप में इलाज किया जाना है, और एक नाव-डिवीजन एक पूर्णांक विभाजन के बजाय किया जाता है:

निम्नलिखित का प्रयास करें ।

ध्यान दें कि अगर आप शाब्दिक के साथ काम कर रहे हैं, आप

float f = 6800/500; 

भाजक एक नाव बनाने के लिए f प्रत्यय शामिल करने के लिए बदल सकते हैं:

float f = 6800f/500; 
      ^
+3

एक और आम विधि 1.0 से संख्यात्मक या denominator गुणा करना है। वैसे, जब तक आप वास्तव में 4 बाइट्स को बचाने की परवाह नहीं करते हैं, तब तक डबल की बजाय फ्लोट का उपयोग करने का लगभग कोई कारण नहीं है। –

+4

@ पॉल: और इसलिए लंबे समय के बजाय कभी भी int का उपयोग करने का कोई कारण नहीं है, जब तक ... [:-) –

+0

@ करलोस, शायद जावा में नहीं (वास्तव में, मुझे नहीं पता), लेकिन सी या सी ++ में, int लंबे समय से काफी तेजी से हो सकता है, जबकि "गणित coprocessors" के लिए धन्यवाद (कुछ याद करते हैं जब ये अलग चिप्स थे) युगल अक्सर फ्लोट की तुलना में तेज़ होते हैं क्योंकि उन्हें परिवर्तित नहीं किया जाना चाहिए। –

3

आप परिशुद्धता के बारे में चिंतित मैं करूंगा तो double का उपयोग करने का सुझाव दें जो परिशुद्धता के अंकों की संख्या से दोगुनी से अधिक है। हालांकि फ्लोटिंग पॉइंट केवल उन अंशों का प्रतिनिधित्व करता है जो 0.5 या योग की शक्तियां हैं। इसका मतलब है कि 0.6 केवल लगभग प्रतिनिधित्व किया जाता है। उचित गोल करने के साथ यह एक समस्या नहीं है।

double d = (double) 6800/500; 

या

double d = 6800.0/500; 
+0

क्या डबल और फ्लोट के बीच कोई परफॉर्मेंस अंतर है ?? .... मैं कुछ हल्का पढ़ रहा हूं और मैं स्मृति उपयोग के बारे में थोड़ा चिंतित हो सकता हूं, जिस मशीन पर सॉफ्टवेयर तैनात किया जा रहा है वह पुराना है –

+0

डबल 4 और बाइट्स का उपयोग करता है। अगर स्मृति बहुत तंग है तो यह 'फ्लोट' का उपयोग करने के लायक हो सकती है और यदि आपके पास इनमें से दस लाख हैं, तो यह 4 एमबी बचा सकता है। यदि आपके पास लाखों नहीं हैं तो शायद इसके बारे में चिंता करने योग्य नहीं है। –

+1

नहीं, मशीन पुरानी नहीं है –

0

हाय यह एक यह ful मदद मिल सकती है आपकी आवश्यकता कोशिश

double percent=(7819140000l-3805200000l)*100f/7819140000l; 
 

 
public String format_Decimal(double decimalNumber) { 
 
\t \t NumberFormat nf = NumberFormat.getInstance(); 
 
\t \t nf.setMaximumFractionDigits(5); 
 
\t \t nf.setMinimumFractionDigits(2); 
 
\t \t nf.setRoundingMode(RoundingMode.HALF_UP); 
 
\t \t String x = nf.format(decimalNumber); 
 
\t \t return x; 
 
\t }

0

मेरे मामले में मैं यह कर रहा था:

double a = (double) (MAX_BANDWIDTH_SHARED_MB/(qCount+1)); 
"सही" के बजाय

:

double a = (double)MAX_BANDWIDTH_SHARED_MB/(qCount+1); 
संबंधित मुद्दे