2010-03-19 7 views
14

मैं गणना करने के लिए (360/24)/60 मैं इस सवाल का जवाब 0.0 हो रही है जब मैं 0.25क्यों (360/24)/60 = 0 ... जावा

शब्दों में मिलना चाहिए रखने के कोशिश कर रहा हूँ में: मैं द्वारा 60

public class Divide { 

    public static void main(String[] args){ 
     float div = ((360/24)/60); 
     System.out.println(div); 

    } 
} 

यह बाहर प्रिंट 24 से 360 विभाजित करने के लिए और फिर विभाजित परिणाम हैं:

0,0

वह क्यों है? मैं वास्तव में कुछ बेवकूफ कर रहा हूँ, या गणित में ऑपरेंड के इस

+1

मैं जीसीसी (सी) के साथ एक ही करने की कोशिश की और यह एक ही मुद्दा भुगतना पड़ता है। –

उत्तर

29

कोई नहीं के लिए एक अच्छा कारण है एक नाव है - तो यह सब पूर्णांक गणित के साथ किया जा रहा है और तो एक नाव के लिए परिवर्तित। आप एक नाव के लिए एक उपयुक्त संकार्य के प्रकार बदलते हैं, तो यह ठीक काम करेंगे:

float div = ((360/24f)/60); // div is now 0.25 

ध्यान दें कि अगर आप सिर्फ 60 एक नाव होना करने के लिए बदल गया है, आपको 360/24 के पहुंचते हैं किया जा रहा है पूर्णांक अंकगणितीय के रूप में - जो इस विशेष मामले में ठीक है, लेकिन यह दर्शाता है कि मुझे वास्तव में क्या इरादा है। असल में आपको यह सुनिश्चित करने की ज़रूरत है कि अंकगणितीय ऑपरेशन जिस तरीके से आप चाहते हैं उसमें किया जा रहा है।

+0

अधिक सटीक: 360/24 = 15 15/60 = 0 हमेशा पूर्णांक के लिए बढ़ाया गया;) – TomTom

+7

* sigh *। Monomorphic संख्यात्मक अक्षर लोगों को भ्रमित करते हैं। पॉलीमोर्फिक न्यूमेरिक अक्षर लोगों को भ्रमित करते हैं। आप बस जीत नहीं सकते। –

24

आप वास्तव में पूर्णांक प्रभाग (JLS 15.17.2) कर रहे हैं।

float div = ((360/24)/60); 
float div = (float) ((360/24)/60); 
float div = (float) (15/60); 
float div = (float) (0); 
float div = 0F; 

चल बिन्दु विभाजन करने के लिए, ऑपरेंड के कम से कम एक एक चल बिन्दु सांख्यिक प्रकार की जरूरत है।

float div = ((360F/24)/60); 
float div = 15F/60; 
float div = 0.25F; 

युक्ति: यदि परिशुद्धता महत्वपूर्ण है, आप float को परिवर्तित करने से पहले double साथ गणना की के रूप में ज्यादा करते हैं, चाहते हैं। असल में, जब तक आपकी प्रोफाइलिंग दर्शाती है कि आपको बिल्कुल float की आवश्यकता है, तो आपको हमेशा double पसंद करना चाहिए।

float f; 

    f = (1E-17F * 1E-17F); 
    System.out.println(f); // prints "9.999999E-35" 

    f = (float) (1E-17D * 1E-17D); 
    System.out.println(f); // prints "1.0E-34" 
+0

क्या आपका मतलब 'डबल' में नहीं है "असल में, आपको शायद लगभग हमेशा 'फ्लोट' का उपयोग करना चाहिए"? –

+0

हाँ, कुछ टाइपो। फिक्स्ड। – polygenelubricants

2

आपका मुख्य विधि में,

public static void main(String[] args){ 
     float div = ((360/24)/60); 
     System.out.println(div); 
} 

ध्यान दें कि 360, 24 और 60 सब पूर्णांक मान हैं। जैसे आप अजीब मूल्य प्राप्त करेंगे।

360/24 -> 15 (बिल्कुल ठीक)
15/60 -> 0.4 (चल बिन्दु)

के लिए दुर्भाग्य से

आप चल बिन्दु संख्या इस प्रकार छोटा कर दिया जाता है आपको मिलता है:

-> 0 (integer value) 

फिर, 0 को फ़्लोटिंग पॉइंट वेरिएबल को असाइन करके, आप 0 को फ़्लोटिंग पॉइंट मान, 0.0 में बदलते हैं। इस प्रकार परिणाम।

आप उन्हें विभाजित करने के लिए आप उन्हें चल बिन्दु मूल्यों में परिवर्तन करने की आवश्यकता चाहते हैं।

सही कोड जैसे होना चाहिए:

public static void main(String[] args){ 
     float div = ((360.0/24.0)/60.0); 
     System.out.println(div); 
}