फ़्लोट बनाम दशमलव का उपयोग कब करें


14

मैं इस एपीआई का निर्माण कर रहा हूं, और डेटाबेस उन मूल्यों को संग्रहीत करेगा जो निम्नलिखित में से एक का प्रतिनिधित्व करते हैं:

  • प्रतिशत
  • औसत
  • मूल्यांकन करें

मुझे ईमानदारी से पता नहीं है कि कैसे कुछ का प्रतिनिधित्व करना है जो कि संख्या 0 से 100% के बीच है। क्या यह होना चाहिए

  • 0.00 - 1.00
  • 0.00 - 100.00
  • कोई अन्य विकल्प जो मुझे नहीं पता है

क्या इसके लिए कोई स्पष्ट विकल्प है? डेटाबेस पर प्रतिनिधित्व करने का एक वैश्विक तरीका जो 0 से 100% प्रतिशत तक जाता है? आगे जाकर, इसके लिए सही प्रकार क्या है, फ्लोट या दशमलव?

धन्यवाद।



5
नंबर कई तरह से स्टोर किए जा सकते हैं। 0-100 का उपयोग करते हुए या 0-1 का उपयोग करते हुए प्रतिशत जमा करने में कुछ भी गलत नहीं है। मायने रखता है कि आपको संख्याओं के साथ क्या करना है, आपको किस सटीकता की आवश्यकता है, और इसी तरह। एक अच्छा उत्तर दिए जाने से पहले आपको अधिक संदर्भ की व्याख्या करनी चाहिए। क्या आपको उन संख्याओं को संग्रहीत करने की आवश्यकता है जो दशमलव अंकों की एक छोटी संख्या के साथ वास्तव में प्रतिनिधित्व करने योग्य हैं? यदि आप चीजों को औसत करते हैं, तो आपको तेरह या सातवें भाग जैसे अंश मिलते हैं। क्या आपको उन लोगों को वास्तव में संग्रहीत करने की आवश्यकता है? या सिर्फ लगभग? कैसे लगभग? आप उनके साथ क्या करेंगे?
एरिक पोस्टपिसिल

1
यदि मान 0.01 से 100 के चरणों में 0.00 से 100.00 है, तो 10001 विभिन्न मूल्य हैं। बस सौवें या पर्मियार्ड या or की इकाइयों में intप्रतिनिधित्व करने के लिए एक का उपयोग करें ।
chux -

@ chux-ReinstateMonica - हाँ, "स्केल किए गए पूर्णांक" संभव हैं, लेकिन अनाड़ी।
रिक जेम्स

@ रिकजम्स शायद। मैंने स्केल किए गए पूर्णांकों को कठिन नहीं पाया है।
chux -

जवाबों:


4

मैं विपरीत रुख अपना लूंगा।

FLOATअनुमानित संख्याओं के लिए है, जैसे प्रतिशत, औसत, आदि। आपको फॉर्मेटिंग करनी चाहिए क्योंकि आप मूल्यों को प्रदर्शित करते हैं, या तो ऐप कोड में या FORMAT()MySQL के फ़ंक्शन का उपयोग करके ।

कभी परीक्षण मत करो float_value = 1.3; ऐसे कई कारण हैं जो असफल होंगे।

DECIMALमौद्रिक मूल्यों के लिए इस्तेमाल किया जाना चाहिए। DECIMALजब एक मूल्य को डॉलर / सेंट / यूरो / आदि के लिए गोल करने की आवश्यकता होती है, तो दूसरी गोलाई से बचा जाता है। लेखाकार सेंट के अंशों को पसंद नहीं करते हैं।

MySQL के DECIMAL65 महत्वपूर्ण अंकों के कार्यान्वयन की अनुमति देता है; FLOATलगभग 7 और DOUBLE16 के बारे में देता है। 7 आमतौर पर सेंसर और वैज्ञानिक गणना के लिए पर्याप्त से अधिक है।

"प्रतिशत" के रूप में - कभी-कभी मैंने उपयोग किया है TINYINT UNSIGNEDजब मैं भंडारण के केवल 1 बाइट का उपभोग करना चाहता हूं और बहुत सटीकता की आवश्यकता नहीं है; कभी-कभी मैंने FLOAT(4 बाइट्स) का उपयोग किया है । विशेष रूप से प्रतिशत के लिए कोई डेटाटाइप ट्यून नहीं है। (यह भी ध्यान दें, कि DECIMAL(2,0)मूल्य पकड़ नहीं सकता है 100, इसलिए तकनीकी रूप से आपको आवश्यकता होगी DECIMAL(3,0)।)

या कभी-कभी मैंने FLOAT0 और 1. के बीच एक मान का उपयोग किया है , लेकिन फिर मुझे "प्रतिशत" प्रदर्शित करने से पहले 100 से गुणा करना सुनिश्चित करना होगा।

अधिक

तीनों "प्रतिशत, औसत, दर" से तैरने जैसी गंध आती है, इसलिए यह मेरी पहली पसंद होगी।

डेटाटाइप पर निर्णय लेने के लिए एक मानदंड ... मूल्य की कितनी प्रतियां मौजूद होंगी?

यदि आपके पास एक प्रतिशत के लिए एक स्तंभ के साथ एक बिलियन-पंक्ति तालिका है, तो विचार करें कि TINYINT1 बाइट (कुल 1GB) FLOATलेगी , लेकिन 4 बाइट्स (कुल 4GB) लेगी। OTOH, अधिकांश अनुप्रयोगों में कई पंक्तियाँ नहीं होती हैं, इसलिए यह प्रासंगिक नहीं हो सकता है।

एक 'सामान्य' नियम के रूप में, "सटीक" मूल्यों के कुछ फार्म का उपयोग करना चाहिए INTया DECIMAL। अस्पष्ट बातें (वैज्ञानिक गणना, वर्गमूल, विभाजन, आदि) का उपयोग FLOAT(या DOUBLE) करना चाहिए ।

इसके अलावा, आउटपुट के प्रारूपण को आमतौर पर एप्लिकेशन फ्रंट एंड पर छोड़ दिया जाना चाहिए। यही है, भले ही "औसत" "14.6666666 ..." की गणना कर सकता है, प्रदर्शन को "14.7" जैसा कुछ दिखाना चाहिए; यह मनुष्यों के लिए मित्रता है। इस बीच, आपके पास बाद में तय करने के लिए अंतर्निहित मूल्य है कि "15" या "14.667" बेहतर आउटपुट स्वरूपण है।

रेंज "0.00 - 100.00" को या तो FLOAT आउटपुट स्वरूपण के साथ या उपयोग किया जा सकता है DECIMAL(5,2)(3 बाइट्स) पूर्व-निर्धारण के साथ कि आप हमेशा संकेतित परिशुद्धता चाहते हैं


3

मैं आमतौर पर उपयोग करने के खिलाफ सलाह दूंगा float। फ़्लोटिंग पॉइंट नंबर बेस -2 में संख्याओं का प्रतिनिधित्व करते हैं, जो कुछ (सटीक) संख्याओं को संचालन या तुलनाओं में गोल-अप होने का कारण बनता है, क्योंकि वे बस आधार -2 में सटीक रूप से संग्रहीत नहीं किए जा सकते हैं। यह व्यवहार को बढ़ा सकता है।

निम्नलिखित उदाहरण पर विचार करें :

create table t (num float);
insert into t values(1.3);

select * from t;

| num |
| --: |
| 1.3 |

select * from t where num = 1.3;

| num |
| --: |

बेस -2 की संख्या की तुलना 1.3विफल हो जाती है। यह मुश्किल है।

तुलना में, दशमलव अपनी सीमा के भीतर परिमित संख्याओं का एक सटीक प्रतिनिधित्व प्रदान करता है। आप को बदलते हैं floatकरने के लिए decimal(2, 1)ऊपर के उदाहरण में, आप अपेक्षित परिणाम मिलता है।


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

4
सटीकता वाले मुद्दे "फ़्लोटिंग पॉइंट नंबरों" के कारण नहीं होते हैं, लेकिन केवल संख्यात्मक अभ्यावेदन के कारण होते हैं: सभी परिमित संख्यात्मक अभ्यावेदन सीमित सटीकता होते हैं: फ़्लोटिंग-पॉइंट, फिक्स्ड-पॉइंट, पूर्णांक, तर्कसंगत, दशमलव, बाइनरी, सब कुछ।
एरिक पोस्टपिसिल

2
आह। आपने क्या तय किया है? मेरी टिप्पणी कहती है कि उत्तर गलत है क्योंकि यह कहता है कि दशमलव अपनी सीमा के भीतर संख्याओं का सटीक प्रतिनिधित्व प्रदान करता है, लेकिन वास्तव में ऐसा नहीं होता है क्योंकि यह ⅓ का सटीक प्रतिनिधित्व प्रदान नहीं करता है। परिवर्तन "सटीक" के बजाय "सटीक" कहता है, लेकिन फिर बाइनरी फ़्लोटिंग-पॉइंट बस के रूप में अच्छा क्यों नहीं है - न तो or के लिए सटीक है, और दोनों या दोनों ही सटीक नहीं हैं, यह इस बात पर निर्भर करता है कि आपकी सटीक सीमा कितनी है और कितनी सटीक है उनके पास है। प्रश्न इंगित करता है कि औसत का प्रतिनिधित्व किया जाएगा, और तीन चीजों का औसत आपको ⅓ जैसी संख्या देता है।
एरिक पोस्टपिसिल

4
टिप्पणी कहती है कि गोल-से-सम-टाई-टू-सम-सम सबसे अधिक उपयोग किया जाता है, लेकिन उत्तर अभी भी राउंड-अप कहता है। उत्तर कहता है कि तुलनाएं राउंड-अप हो सकती हैं, लेकिन तुलना सही है: तुलनात्मक रूप से हमेशा गणितीय रूप से सही परिणाम मिलता है, जिसमें कोई गोल नहीं होता है। (कुछ प्रोग्रामिंग भाषाएं तुलना करने से पहले ऑपरेंड बदल सकती हैं, लेकिन वे अलग-अलग ऑपरेशन हैं।)
एरिक पोस्टपिसिल

1
बाइनरी या दशमलव में 1/3 का बिल्कुल प्रतिनिधित्व नहीं किया जा सकता है । $ 14.99 में से 20% की छूट के लिए राउंडिंग फ्रैक्शनल सेंट की आवश्यकता नहीं होगी।
रिक जेम्स

0

फ्लोट और दशमलव के बीच अंतर सटीक हैं। दशमलव प्रारूप की सटीकता के भीतर दशमलव किसी भी संख्या का 100% सटीक रूप से प्रतिनिधित्व कर सकता है, जबकि फ्लोट, सभी संख्याओं का सही प्रतिनिधित्व नहीं कर सकता है।

जैसे वित्तीय संबंधित मूल्य के लिए दशमलव का उपयोग करें और उदाहरण के लिए ग्राफिकल संबंधित मूल्य के लिए फ्लोट का उपयोग करें


0

decimal(5,2)यदि आप decimalसटीक सटीकता को संरक्षित करने के लिए हैं, तो आप इसे उसी तरह से स्टोर करने की सलाह देते हैं, जब आप इसे उसी तरह से स्टोर करने जा रहे हैं । (देखें https://dev.mysql.com/doc/refman/8.0/en/fixed-point-types.html )

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

( https://dev.mysql.com/doc/refman/8.0/en/floating-point-types.html )

SQL कथन में लिखा गया फ्लोटिंग-पॉइंट मान आंतरिक रूप से दर्शाए गए मान के समान नहीं हो सकता है।

DECIMAL कॉलम के लिए, MySQL 65 दशमलव अंकों की सटीकता के साथ संचालन करता है, जो कि सबसे आम अशुद्धि समस्याओं को हल करना चाहिए।

https://dev.mysql.com/doc/refman/8.0/en/problems-with-float.html


0

दशमलव: वित्तीय अनुप्रयोगों के मामले में दशमलव प्रकार का उपयोग करना बेहतर है क्योंकि यह आपको उच्च स्तर की सटीकता देता है और गोल त्रुटियों से बचने में आसान है

डबल: डबल प्रकार संभवतः पैसे को संभालने के अलावा वास्तविक मूल्यों के लिए सबसे अधिक इस्तेमाल किया जाने वाला डेटा प्रकार है।

फ्लोट: इसका उपयोग ज्यादातर ग्राफिक पुस्तकालयों में किया जाता है क्योंकि प्रसंस्करण शक्तियों की बहुत अधिक मांग है, ऐसी स्थितियों का भी उपयोग किया जाता है जो गोलाई की त्रुटियों को सहन कर सकती हैं।

संदर्भ: http://net-informations.com/q/faq/float.html


0
mysql> create table numbers (a decimal(10,2), b float);
mysql> insert into numbers values (100, 100);
mysql> select @a := (a/3), @b := (b/3), @a * 3, @b * 3 from numbers \G

*********************************************************************

@a := (a/3): 33.333333333
@b := (b/3): 33.333333333333
@a + @a + @a: 99.999999999000000000000000000000
@b + @b + @b: 100

दशमलव ने वास्तव में इस मामले पर क्या करना है, यह बाकी को छोटा कर दिया, इस प्रकार 1/3 भाग खो दिया।

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

मुझे उम्मीद है कि इससे सहायता मिलेगी।


0

Tsql में: फ्लोट, 0 के रूप में स्टोर और इसे दशमलव बिंदु अंक के बाद परिभाषित करने की आवश्यकता नहीं है, उदाहरण के लिए आपको फ्लोट (4,2) लिखने की आवश्यकता नहीं है। दशमलव, 0.0 स्टोर 0.0 के रूप में और इसमें दशमलव (4,2) की तरह परिभाषित करने का विकल्प है, मैं सुझाता हूं 0.00-1.00, ऐसा करने से आप उस प्रतिशत के मूल्य को 100 से गुणा किए बिना गणना कर सकते हैं, और यदि आप रिपोर्ट करते हैं तो डेटा प्रकार सेट करें एमएस एक्सेल के रूप में प्रतिशत और जैसे अन्य मंच दृश्य के रूप में उस स्तंभ की 0.5 -> 50%

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