जावा में फ्लोट और डबल डेटाटाइप


220

फ्लोट डेटा प्रकार एक एकल-सटीक 32-बिट IEEE 754 फ़्लोटिंग पॉइंट है और डबल डेटा प्रकार एक डबल-सटीक 64-बिट IEEE 754 फ़्लोटिंग पॉइंट है।

इसका क्या मतलब है? और मुझे डबल या इसके विपरीत फ्लोट का उपयोग कब करना चाहिए?


8
मेमोरी का उपयोग महत्वपूर्ण होने पर आपको डबल की बजाय फ्लोट्स का उपयोग करना चाहिए। यदि आपको अधिक सटीक गणना की आवश्यकता है, तो युगल का उपयोग करें।
Everv0id

12
@ Everv0id: मैं ऐसी किसी भी स्थिति के बारे में सुनिश्चित नहीं हूं जिसमें स्मृति इतनी तंग थी कि किसी को अंतरिक्ष के लिए सटीकता का बलिदान करना पड़े। (आप जावा का उपयोग कर रहे हैं , अच्छाई की खातिर ...) इसके लिए बुलाए जाने पर कुछ स्थितियां हो सकती हैं, लेकिन मेरे व्यवहार में मैंने इसे बहुत कम देखा है। यदि आप इस बारे में विस्तार से जानना चाहते हैं कि आप यह क्यों मानते हैं कि यह एक अच्छा विचार है, तो उदाहरण के लिए उत्तर देना एक योग्य योग है।
मकोतो


5
@ मकाटो वास्तव में, मैंने कभी भी फ्लोट्स का उपयोग नहीं किया है, केवल डबल्स। लेकिन ऐसे अनुप्रयोग (सिद्धांत रूप में) हो सकते हैं जिनमें बड़ी मात्रा में फ्लोटिंग पॉइंट नंबर होने चाहिए, इसलिए 2x मेमोरी का उपयोग महत्वपूर्ण हो सकता है। सिद्धांत रूप में, inc; व्यवहार में आप हमेशा एक और सर्वर खरीद सकते हैं ।
Everv0id

3
मैंने स्मृति को बचाने के लिए 4 बाइट और यहां तक ​​कि 2 बाइट फिक्स्ड सटीक संख्याओं का उपयोग किया है, लेकिन जब तक आपके पास इनमें से अरबों नहीं हैं तब तक इसके लायक होने की संभावना नहीं है। आपको "फ्लोट" के बजाय "डबल" लिखने में लगने वाला समय (इसमें एक और अक्षर है) आपके द्वारा उपयोग की जाने वाली अतिरिक्त मेमोरी से 1000 गुना अधिक है, लेकिन यदि आप इसका उपयोग किसी सटीक संबंधित बग doubleसे floatबचाता है, तो यह इसके लायक है। ।
पीटर लॉरी

जवाबों:


259

इस पर विकिपीडिया पेज शुरू करने के लिए एक अच्छी जगह है।

सारांश में:

  • float32 बिट्स में दर्शाया गया है, 1 साइन बिट के साथ, 8 बिट्स के प्रतिपादक, और 23 बिट्स का महत्व (या जो एक वैज्ञानिक-संकेतन संख्या से निम्नानुसार है: 2.33728 * 10 12 ; 33728 का महत्व है)।

  • double 64 बिट्स में दर्शाया गया है, जिसमें 1 साइन बिट, 11 बिट्स ऑफ एक्सपोनेंट, और 52 बिट्स ऑफ महत्व है।

डिफ़ॉल्ट रूप से, जावा doubleअपने फ्लोटिंग-पॉइंट अंकों (ताकि एक शाब्दिक 3.14टाइप किया गया है double) का प्रतिनिधित्व करने के लिए उपयोग करता है । यह डेटा प्रकार भी है जो आपको बहुत बड़ी संख्या सीमा प्रदान करेगा, इसलिए मैं इसके उपयोग को अधिक प्रोत्साहित करूंगा float

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

यदि आपको सटीकता की आवश्यकता है - उदाहरण के लिए, आपके पास एक दशमलव मान नहीं हो सकता है जो गलत है (जैसे 1/10 + 2/10), या आप मुद्रा के साथ कुछ भी कर रहे हैं (उदाहरण के लिए, सिस्टम में $ 10.33 का प्रतिनिधित्व करते हुए), तो एक का उपयोग करें BigDecimal, जो एक का समर्थन कर सकता है सटीक और इस तरह की स्थितियों को संभालने की मनमानी मात्रा।


4
क्या उदाहरण में 233728 == मंटिसा नहीं है? मेरा मतलब है, पूर्णांक भाग कहां संग्रहीत है?
JaLoveAst1k

1
@ mathguy54: वैज्ञानिक संकेतन में, 2 पूर्णांक होगा और .33728 मंटिसा होगा। यहाँ उस के लिए एक संदर्भ है।
मकोतो

5
मैं फ़्लोट्स और डबल्स पर जानकारी खोज रहा था और यह पाया और टिप्पणी करने की आवश्यकता थी: यदि आप ऐसी मुद्रा के साथ कुछ भी कर रहे हैं जिसमें भिन्नात्मक सेंट शामिल नहीं हैं, तो BigDecimal का उपयोग करना हास्यास्पद है। आम मुद्रा असतत डेटा है, इसलिए आपको पूर्णांक डेटा प्रकार का उपयोग करना चाहिए। (यह युवा प्रोग्रामर्स द्वारा की गई अधिक सामान्य त्रुटियों में से एक है - चूंकि हम सेंट से डॉलर को अलग करने के लिए a का उपयोग करते हैं, उन्हें लगता है कि यह एक फ्लोटिंग पॉइंट वैल्यू है। यह नहीं है।)
Trixie Wolf

2
@ TrixieWolf, क्या आप अधिक विशिष्ट हो सकते हैं, क्या आपने दो पूर्णांकों (पूर्णांक और दशमलव भागों) का उपयोग करने का प्रस्ताव दिया है? और आप आम मुद्रा के बारे में बात कर रहे हैं, बाकी के बारे में क्या? कुछ राशि का मूल्यांकन 6 दशमलव के साथ किया जाता है, इसलिए आप बस नहीं कर सकते *100। कृपया, आपके पास यहां एक बिंदु है, लेकिन क्या आप अधिक सटीक हो सकते हैं :)
AxelH

9
@ AxelH वित्तीय गणना की उन पहेलियों को छोड़कर जहाँ भिन्नात्मक सेंट मौजूद हो सकते हैं, पैसा हमेशा असतत होता है। आप डेटा को संग्रहीत करने के लिए एक पूर्णांक प्रकार का उपयोग करेंगे। तो $ 5.34 को 534 के रूप में संग्रहीत किया जाएगा। पूर्णांक गणित में डॉलर का भाग वैल / 100 है, और सेंट पूर्णांक गणित में वैल% 100 हैं, जहां% शेष संचालन को संदर्भित करता है। दशमलव से अधिक स्थानों वाले धन के लिए इसे अभी भी अभिन्न के रूप में संग्रहीत किया जाना चाहिए क्योंकि यह असतत है। यहां तक ​​कि अगर यह असतत नहीं है, तो अक्सर आप ज्यादातर समय असतत भंडारण पर वापस जाना चाहते हैं क्योंकि यह सटीक है, इसलिए आप गोल चक्कर में पैसे नहीं खोएंगे।
ट्रिक्स वुल्फ

72

एक फ्लोट आपको लगभग देता है। 6-7 दशमलव अंक सटीक जबकि एक डबल आप लगभग देता है। 15-16। साथ ही संख्या की सीमा दोगुनी के लिए बड़ी है।

एक डबल को 8 बाइट्स स्टोरेज स्पेस की जरूरत होती है जबकि फ्लोट को सिर्फ 4 बाइट्स की जरूरत होती है।


13

फ्लोटिंग-पॉइंट नंबर, जिसे वास्तविक संख्या के रूप में भी जाना जाता है, का उपयोग उन भावों का मूल्यांकन करते समय किया जाता है, जिन्हें आंशिक परिशुद्धता की आवश्यकता होती है। उदाहरण के लिए, वर्गमूल, या ट्रान्सेंडेंटल जैसे साइन और कोसाइन जैसी गणनाओं के परिणामस्वरूप एक मूल्य होता है जिसकी सटीकता के लिए फ्लोटिंग-पॉइंट प्रकार की आवश्यकता होती है। जावा फ्लोटपॉइंट प्रकार और ऑपरेटरों के मानक (IEEE-754) को लागू करता है। फ्लोटिंग-पॉइंट दो प्रकार के होते हैं, फ्लोट और डबल, जो क्रमशः एकल और डबल-सटीक संख्याओं का प्रतिनिधित्व करते हैं। उनकी चौड़ाई और सीमाएँ यहाँ दिखाई गई हैं:


   Name     Width in Bits   Range 
    double  64              1 .7e308 to 1.7e+308
    float   32              3 .4e038 to 3.4e+038


नाव

प्रकार फ़्लोट एकल-सटीक मान निर्दिष्ट करता है जो 32 बिट्स संग्रहण का उपयोग करता है। एकल परिशुद्धता कुछ प्रोसेसरों पर तेज़ होती है और डबल परिशुद्धता के रूप में आधी जगह लेती है, लेकिन जब मान या तो बहुत बड़े या बहुत छोटे होते हैं तो अपवित्र हो जाएंगे। जब आप एक भिन्नात्मक घटक की आवश्यकता होती है, तो टाइप फ़्लोट के वेरिएबल्स उपयोगी होते हैं, लेकिन बड़ी मात्रा में परिशुद्धता की आवश्यकता नहीं होती है।

यहाँ कुछ उदाहरण फ्लोट वैरिएबल घोषणाएँ हैं:

नाव भाड़ा, तश्तरी;


दोहरा

डबल सटीक, जैसा कि डबल कीवर्ड द्वारा दर्शाया गया है, एक मूल्य को संग्रहीत करने के लिए 64 बिट्स का उपयोग करता है। डबल परिशुद्धता वास्तव में कुछ आधुनिक प्रोसेसर पर एकल परिशुद्धता की तुलना में तेज़ है जो उच्च गति गणितीय गणना के लिए अनुकूलित किया गया है। सभी ट्रांसेंडेंटल मैथ फ़ंक्शंस, जैसे पाप (), कॉस (), और स्क्वैर्ट (), दोहरे मान लौटाते हैं। जब आपको कई पुनरावृत्त गणनाओं पर सटीकता बनाए रखने की आवश्यकता होती है, या बड़ी-मूल्यवान संख्याओं में हेरफेर कर रहे हैं, तो डबल सबसे अच्छा विकल्प है।


यह उत्तर स्पष्ट रूप से स्पष्ट है कि हमें फ्लोट और डबल का उपयोग करना चाहिए। क्यों नहीं?
ये विन

8
जावा में मुद्रा के लिए न तो floatऔर न ही doubleसबसे अच्छा उपयोग किया जाता है, क्योंकि वे गोलाई त्रुटियों के लिए अवसर खोलते हैं। यह लेख और अधिक विस्तार में जाता है: javapractices.com/topic/TopicAction.do?Id=13
PPartisan

1
"फ्लोट डॉलर और सेंट का प्रतिनिधित्व करते समय उपयोगी हो सकता है।" - नहीं नहीं नहीं नहीं नहीं नहीं नहीं। कभी भी, मुद्रा को फ्लोट / डबल्स के रूप में संग्रहीत न करें।
गतिविधि

2

जावा को लगता है कि गैर-संगणना के लिए दोहरे उपयोग की ओर एक पूर्वाग्रह है:

इस मामले में आज मैंने पहले लिखे गए कार्यक्रम के अनुसार, जब मैं फ्लोट का उपयोग करता था तब विधियां काम नहीं करती थीं, लेकिन अब जब मैंने फ्लोट (नेटबीन्स आईडीई में) के साथ प्रतिस्थापित किया तो यह बहुत अच्छा है:

package palettedos;
import java.util.*;

class Palettedos{
    private static Scanner Z = new Scanner(System.in);
    public static final double pi = 3.142;

    public static void main(String[]args){
        Palettedos A = new Palettedos();
        System.out.println("Enter the base and height of the triangle respectively");
        int base = Z.nextInt();
        int height = Z.nextInt();
        System.out.println("Enter the radius of the circle");
        int radius = Z.nextInt();
        System.out.println("Enter the length of the square");
        long length = Z.nextInt();
        double tArea = A.calculateArea(base, height);
        double cArea = A.calculateArea(radius);
        long sqArea = A.calculateArea(length);
        System.out.println("The area of the triangle is\t" + tArea);
        System.out.println("The area of the circle is\t" + cArea);
        System.out.println("The area of the square is\t" + sqArea);
    }

    double calculateArea(int base, int height){
        double triArea = 0.5*base*height;
        return triArea;
    }

    double calculateArea(int radius){
        double circArea = pi*radius*radius;
        return circArea;
    }

    long calculateArea(long length){
        long squaArea = length*length;
        return squaArea;
    }
}

मुझे आज भी यही समस्या थी। इस पूर्वाग्रह के पीछे क्या कारण हो सकता है?
शची

2

यह त्रुटि देगा:

public class MyClass {
    public static void main(String args[]) {
        float a = 0.5;
    }
}

/MyClass.java:3: त्रुटि: असंगत प्रकार: संभव हानिपूर्ण रूपांतरण डबल से फ्लोट फ्लोट ए = 0.5;

यह पूरी तरह से ठीक काम करेगा

public class MyClass {
    public static void main(String args[]) {
        double a = 0.5;
    }
}

यह भी पूरी तरह से ठीक काम करेगा

public class MyClass {
    public static void main(String args[]) {
        float a = (float)0.5;
    }
}

कारण : जावा डिफ़ॉल्ट रूप से वास्तविक संख्या को दोगुना करता है ताकि उच्च परिशुद्धता सुनिश्चित हो सके।

डबल अधिक जगह लेता है लेकिन गणना के दौरान अधिक सटीक और फ्लोट कम जगह लेता है लेकिन कम सटीक होता है।


1

IEEE मानकों के अनुसार, फ्लोट एक वास्तविक संख्या का 32 बिट प्रतिनिधित्व है जबकि डबल 64 बिट प्रतिनिधित्व है।

जावा कार्यक्रमों में हम आम तौर पर डबल डेटा प्रकार का उपयोग करते हैं। यह केवल ओवरफ्लो से बचने के लिए है क्योंकि डबल डेटा प्रकार का उपयोग करके समायोजित की जा सकने वाली संख्या की सीमा अधिक होती है जब फ्लोट का उपयोग किया जाता है।

इसके अलावा जब उच्च परिशुद्धता की आवश्यकता होती है, तो दोहरे के उपयोग को प्रोत्साहित किया जाता है। कुछ समय पहले लागू किए गए कुछ पुस्तकालय विधियों को अभी भी फ्लोट डेटा प्रकार के उपयोग की आवश्यकता होगी (यह केवल इसलिए है क्योंकि इसे फ्लोट का उपयोग करके लागू किया गया था, और कुछ नहीं!)।

लेकिन अगर आप निश्चित हैं कि आपके प्रोग्राम को छोटी संख्या की आवश्यकता है और फ्लोट के उपयोग के साथ एक अतिप्रवाह नहीं होगा, तो फ्लोट का उपयोग काफी हद तक आपकी अंतरिक्ष जटिलता में सुधार करेगा क्योंकि फ्लोट्स को डबल द्वारा आवश्यक आधी मेमोरी की आवश्यकता होती है।


0

यह उदाहरण दिखाता है कि जावा में एक फ्लोट से संकेत (सबसे बाईं ओर), एक्सपोनेंट (8 निम्नलिखित बिट्स) और मंटिसा (23 सबसे दाहिने बिट्स) को कैसे निकाला जाए।

int bits = Float.floatToIntBits(-0.005f);
int sign = bits >>> 31;
int exp = (bits >>> 23 & ((1 << 8) - 1)) - ((1 << 7) - 1);
int mantissa = bits & ((1 << 23) - 1);
System.out.println(sign + " " + exp + " " + mantissa + " " +
  Float.intBitsToFloat((sign << 31) | (exp + ((1 << 7) - 1)) << 23 | mantissa));

एक ही दृष्टिकोण का उपयोग डबल के लिए किया जा सकता है (11 बिट घातांक और 52 बिट मंटिसा)।

long bits = Double.doubleToLongBits(-0.005);
long sign = bits >>> 63;
long exp = (bits >>> 52 & ((1 << 11) - 1)) - ((1 << 10) - 1);
long mantissa = bits & ((1L << 52) - 1);
System.out.println(sign + " " + exp + " " + mantissa + " " +
  Double.longBitsToDouble((sign << 63) | (exp + ((1 << 10) - 1)) << 52 | mantissa));

साभार: http://sj.github.io/java-float/


0

आपको सटीक गणना के लिए फ्लोट के बजाय डबल का उपयोग करना चाहिए, और कम सटीक गणना का उपयोग करते समय डबल के बजाय फ्लोट करना चाहिए। फ्लोट में केवल दशमलव संख्याएँ होती हैं, लेकिन डबल में IEEE754 डबल-सटीक फ़्लोटिंग पॉइंट संख्या होती है, जिससे संख्याओं को अधिक सटीक रूप से समाहित करना और गणना करना आसान हो जाता है। उम्मीद है की यह मदद करेगा।


0

नियमित प्रोग्रामिंग गणना में, हम फ्लोट का उपयोग नहीं करते हैं। यदि हम यह सुनिश्चित करते हैं कि परिणाम सीमा फ्लोट डेटा प्रकार की सीमा के भीतर है तो हम मेमोरी को बचाने के लिए फ्लोट डेटा प्रकार चुन सकते हैं। आमतौर पर, हम दो कारणों से दोहरे का उपयोग करते हैं: -

  • यदि हम फ्लोटिंग-पॉइंट नंबर को फ्लोट डेटा प्रकार के रूप में उपयोग करना चाहते हैं, तो विधि कॉलर को एफ या एफ को स्पष्ट रूप से प्रत्यय देना चाहिए, क्योंकि डिफ़ॉल्ट रूप से प्रत्येक फ्लोटिंग-पॉइंट नंबर को डबल माना जाता है। यह प्रोग्रामर पर बोझ बढ़ाता है। यदि हम एक फ्लोटिंग-पॉइंट नंबर का उपयोग डबल डेटा प्रकार के रूप में करते हैं तो हमें किसी भी प्रत्यय को जोड़ने की आवश्यकता नहीं है।
  • फ्लोट एक एकल-सटीक डेटा प्रकार है जिसका अर्थ है कि यह 4 बाइट्स रखता है। इसलिए बड़ी संगणनाओं में, हमें पूर्ण परिणाम नहीं मिलेगा। यदि हम डबल डेटा प्रकार चुनते हैं, तो यह 8 बाइट्स पर कब्जा कर लेता है और हमें पूर्ण परिणाम मिलेंगे।

फ्लोट और डबल डेटा प्रकार दोनों को विशेष रूप से वैज्ञानिक गणना के लिए डिज़ाइन किया गया था, जहां अनुमानित त्रुटियां स्वीकार्य हैं। यदि सटीकता सबसे पूर्व चिंता का विषय है, तो इसे फ्लोट या डबल डेटा प्रकारों के बजाय बिगडेसिमल वर्ग का उपयोग करने की सिफारिश की जाती है। स्रोत: - जावा में फ्लोट और डबल डेटैटिप

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.