मैं उलझन में हूँ। अगर मैंDoubleStream.sum() का परिणाम सीधे जोड़ से अलग क्यों होता है?
System.out.println(0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1);
की गणना करता हूं तो मुझे 0.9999999999999999
का परिणाम मिलता है। लेकिन अगर मैं
Double sum = DoubleStream.builder().add(0.1).add(0.1).add(0.1).add(0.1).add(0.1).add(0.1).add(0.1).add(0.1).add(0.1).add(0.1).build().sum();
System.out.println(sum);
फिर गणना मैं 1.0
का एक परिणाम मिलता है। कोई अंतर क्यों है?
संबंधित: https://stackoverflow.com/questions/588004/is-floating-point-math-broken – GhostCat
और ध्यान रखें: पहली पंक्ति है ** पूरी तरह से * * संकलक द्वारा गणना की। यह लगातार फोल्डिंग करता है और आपके लिए इन मानों को जोड़ता है। अपने बाइट कोड की जांच करें - आपको विकल्प 1 के लिए वहां कोई अतिरिक्त नहीं मिलेगा। – GhostCat
@GostCat यह अभी भी एक अच्छा सवाल है। हां, फ्लोटिंग पॉइंट गणित अतुलनीय है, लेकिन यह लगातार होना चाहिए। यह यादृच्छिक नहीं है। क्या अंतर बताता है? –