2011-11-25 16 views
18

संभव डुप्लिकेट:
Varying behavior for possible loss of precisionजावा "प्लस बराबर" ऑपरेटर का उपयोग करते समय डबल से पूर्णांक तक अंतर्निहित प्रकार रूपांतरण क्यों करता है?

कोड नमूना एक

public class Test {               
    public static void main(String[] args) { 
     int i = 0; 
     i = i + 1.5; 
    } 
} 

कोड नमूना बी

public class Test {               
    public static void main(String[] args) { 
     int i = 0; 
     i += 1.5; 
    } 
} 

Unsurprisin gly, संकलन ए नीचे त्रुटि उत्पन्न करता है। आश्चर्यजनक रूप से, बी संकलन बी कोई त्रुटि उत्पन्न नहीं करता है और ऐसा लगता है जैसे मैंने डबल मान 1.5 से पहले पूर्णांक में एक स्पष्ट कलाकार डाला। दुनिया में ऐसा क्यों होता है? यह सब कुछ के खिलाफ चला गया मैंने सोचा था कि मुझे पता था!

Test.java:6: possible 

loss of precision 

    found : double 
    required: int 
      i = i + 1.5; 
       ^
    1 error 
+1

@Dave सही चिंताजनक ओर से है। ओह ठीक है, कोई भाषा सही नहीं है। :) –

उत्तर

13

यह डिज़ाइन के रूप में काम कर रहा है। यौगिक ऑपरेटर ऑपरेशन में एक निहित कलाकार डालते हैं। अन्यथा आपको एक स्पष्ट कलाकार का उपयोग करना होगा।

अधिक जानकारी?

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.26.2

+2

+1 अच्छा जवाब है लेकिन यहां एक और सीधा लिंक है: http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#5304 –

+1

लिंक के बारे में काफी उचित है। धन्यवाद! – Mechkov

+0

बहुत बढ़िया, लिंक के लिए धन्यवाद, रे। – danmcardle

4

को Java language specification, section 15.26.2 अनुसार:

रूप E1 सेशन की एक यौगिक काम अभिव्यक्ति = E2 E1 = (टी) ((ई 1) सेशन (E2)) के बराबर है, जहां टी है ई 1 का प्रकार, सिवाय इसके कि ई 1 का मूल्यांकन केवल एक बार किया जाता है। उदाहरण के लिए, निम्नलिखित कोड सही है:

short x = 3; 
x += 4.6; 

और एक्स में परिणाम मूल्य 7 होने क्योंकि यह के बराबर है:

short x = 3; 
x = (short)(x + 4.6); 
संबंधित मुद्दे