MySQL: फ्लोट और डबल में क्या अंतर है?


110

नई डेटाबेस संरचना में जाँचने पर मैंने देखा कि किसी ने फ्लोट से डबल में फ़ील्ड को बदल दिया है। आश्चर्य है कि, मैंने mysql प्रलेखन की जाँच की, लेकिन ईमानदारी से यह नहीं समझा कि अंतर क्या है।

क्या कोई समझा सकता है?



1
मुझे लगता है कि आप इस लिंक का मतलब है: dev.mysql.com/doc/refman/5.0/en/problems-with-float.html
arun

यह और अधिक सहायक हो सकता है: stackoverflow.com/questions/5150274/…
इफ़ती महमूद

इसके अलावा प्रासंगिक: पॉइंट # 5 at dev.mysql.com/doc/refman/5.0/en/no-matching-rows.html
rinogo

जवाबों:


106

वे दोनों फ्लोटिंग पॉइंट नंबरों का प्रतिनिधित्व करते हैं। A FLOATएकल-परिशुद्धता के लिए है, जबकि DOUBLEडबल-सटीक संख्याओं के लिए है।

MySQL एकल-सटीक मानों के लिए चार बाइट्स और डबल-परिशुद्धता मानों के लिए आठ बाइट्स का उपयोग करता है।

फ़्लोटिंग पॉइंट नंबरों और दशमलव (न्यूमेरिक) नंबरों से एक बड़ा अंतर है, जिसका उपयोग आप DECIMALडेटा प्रकार के साथ कर सकते हैं । इसका उपयोग फ्लोटिंग पॉइंट नंबरों के विपरीत सटीक संख्यात्मक डेटा मानों को संग्रहीत करने के लिए किया जाता है, जहां मौद्रिक डेटा के साथ सटीक सटीकता को संरक्षित करना महत्वपूर्ण है।


27
क्या आप उदाहरण के साथ विस्तृत कर सकते हैं
कैलास

4
@ कैलास फ़्लोट्स गोल हो जाते हैं और दशमलव नहीं होते हैं। दशमलव (9,3) उदाहरण के लिए 123456.789 हो सकता है जबकि अगर आपने 123456.789 स्टोर करने की कोशिश की तो यह 123456.0 फ्लोट के रूप में डाला जाएगा।
ब्लेक

76

शायद यह उदाहरण समझा सकता है।

CREATE TABLE `test`(`fla` FLOAT,`flb` FLOAT,`dba` DOUBLE(10,2),`dbb` DOUBLE(10,2)); 

हमारे पास इस तरह की एक तालिका है:

+-------+-------------+
| Field | Type        |
+-------+-------------+
| fla   | float       |
| flb   | float       |
| dba   | double(10,2)|
| dbb   | double(10,2)|
+-------+-------------+

पहले अंतर के लिए, हम प्रत्येक क्षेत्र में '1.2' के साथ एक रिकॉर्ड डालने की कोशिश करते हैं:

INSERT INTO `test` values (1.2,1.2,1.2,1.2);

तालिका इस तरह दिखा:

SELECT * FROM `test`;

+------+------+------+------+
| fla  | flb  | dba  | dbb  |
+------+------+------+------+
|  1.2 |  1.2 | 1.20 | 1.20 |
+------+------+------+------+

फर्क देखें?

हम अगले उदाहरण की कोशिश करते हैं:

SELECT fla+flb, dba+dbb FROM `test`;

होला! हम इस तरह से अंतर पा सकते हैं:

+--------------------+---------+
| fla+flb            | dba+dbb |
+--------------------+---------+
| 2.4000000953674316 |    2.40 |
+--------------------+---------+

1
शायद एक बेहतर तुलना के लिए fla और flb 2 दशमलव अंक दिए गए होंगे। float(10, 2)
आभारी

30

डबल्स केवल फ्लोट्स की तरह होते हैं, केवल इस तथ्य को छोड़कर कि वे दो बार बड़े होते हैं। यह अधिक सटीकता की अनुमति देता है।


ध्यान दें कि तैरता है और कुछ बिंदु के बाद गोल हो जाता है। उदाहरण के लिए 100000.1 फ्लोट के रूप में 100000 तक छोटा हो जाता है।
ब्लेक

14

सोचा मैं अपने खुद के उदाहरण है कि मदद की मुझे मान का उपयोग कर अंतर देखना जोड़ना होगा 1.3जब जोड़ने या दूसरे के साथ गुणा float, decimalऔर double

1.3फ्लोट 1.3विभिन्न प्रकारों में जोड़ा गया :

|float              | double | decimal |
+-------------------+------------+-----+
|2.5999999046325684 | 2.6    | 2.60000 |

1.31.3विभिन्न प्रकारों द्वारा तैरता हुआ

| float              | double             | decimal      |
+--------------------+--------------------+--------------+
| 1.6899998760223411 | 1.6900000000000002 | 1.6900000000 |

यह MySQL 6.7 का उपयोग कर रहा है

प्रश्न:

SELECT 
    float_1 + float_2 as 'float add',
    double_1 + double_2 as 'double add',
    decimal_1 + decimal_2 as 'decimal add',

    float_1 * float_2 as 'float multiply',
    double_1 * double_2 as 'double multiply',
    decimal_1 * decimal_2 as 'decimal multiply'
FROM numerics

तालिका बनाएं और डेटा डालें:

CREATE TABLE `numerics` (
  `float_1` float DEFAULT NULL,
  `float_2` float DEFAULT NULL,
  `double_1` double DEFAULT NULL,
  `double_2` double DEFAULT NULL,
  `decimal_1` decimal(10,5) DEFAULT NULL,
  `decimal_2` decimal(10,5) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `_numerics` 
    (
        `float_1`,
        `float_2`,
        `double_1`,
        `double_2`,
        `decimal_1`,
        `decimal_2`
    )
VALUES
    (
        1.3,
        1.3,
        1.3,
        1.3,
        1.30000,
        1.30000
    );

11

FLOAT आठ स्थानों तक सटीकता के साथ फ्लोटिंग पॉइंट संख्याओं को संग्रहीत करता है और इसमें चार बाइट्स होते हैं जबकि DOUBLE 18 स्थानों तक सटीकता के साथ फ़्लोटिंग पॉइंट संख्याओं को संग्रहीत करता है और इसमें आठ बाइट्स होते हैं।


11

फ्लोट में 8 स्थानों की सटीकता के साथ 32 बिट (4 बाइट्स) हैं। डबल में 16 स्थानों की सटीकता के साथ 64 बिट (8 बाइट्स) हैं।

यदि आपको बेहतर सटीकता की आवश्यकता है, तो फ्लोट के बजाय डबल का उपयोग करें ।

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