2012-06-20 18 views
6

मुझे SQL सर्वर में फ़्लोट को दशमलव (28,10) रूपांतरित करने की आवश्यकता है। मेरी समस्या यह है कि फ्लोट की प्रकृति के कारण, और जिस तरह से रूपांतरण किए जाते हैं, बस फ्लोट कास्टिंग करने से यह मेरे उपयोगकर्ताओं के लिए गलत संख्या हो सकता है।फ़्लोट से दशमलव तक (SQL सर्वर)

उदाहरण के लिए:

Float:    280712929.22 
Cast as Decimal:  280712929.2200000300 
What I think I want: 280712929.2200000000 

मैं जिस तरह से नाव काम करता है के बारे में थोड़ा समझ में समझने के लिए क्यों यह अंत में 300 कहते हैं पर्याप्त नहीं (है कि यह एक अनुमानित डेटा आदि प्रकार है), लेकिन बेशक। क्या यह आसानी से रूपांतरण के दुष्प्रभाव के रूप में कचरा है, या यह किसी भी तरह फ्लोट वास्तव में स्टोर करता है का एक और सटीक प्रतिनिधित्व है? मेरे लिए ऐसा लगता है कि यह पतली हवा से सटीक खींच लिया गया है।

आखिरकार, मुझे यह सटीक होना चाहिए, लेकिन "दाएं" को भी देखना चाहिए। मुझे लगता है कि मुझे उस नीचे की संख्या प्राप्त करने की आवश्यकता है, जैसा कि ऐसा लगता है कि मैंने अभी पिछली शून्य जोड़ दी है। क्या यह संभव है? क्या यह एक अच्छा या बुरा विचार है, और क्यों? अन्य सुझावों का स्वागत है।

कुछ अन्य उदाहरण:

Float:   364322379.5731 
Cast as Decimal: 364322379.5730999700 
What I want:  364322379.5731000000 

Float:   10482308902 
Cast as Decimal: 10482308901.9999640000 
What I want:  10482308902.0000000000 

साइड नोट: नया डेटाबेस तालिका है कि मैं में इन मूल्यों को डाल रहा हूं मेरे उपयोगकर्ता द्वारा पठनीय है। उन्हें वास्तव में केवल दो दशमलव स्थानों की आवश्यकता है, लेकिन भविष्य में यह बदल सकता है इसलिए हमने दशमलव (28,10) के साथ जाने का फैसला किया है। दीर्घकालिक लक्ष्य फ़्लोट कॉलम को कनवर्ट करना है जिसे मैं अपना डेटा दशमलव से भी प्राप्त कर रहा हूं।

संपादित करें: कभी-कभी फ़्लोट जो मेरे पास कभी भी आवश्यक दशमलव की तुलना में अधिक दशमलव स्थान हैं, उदाहरण के लिए: -0.628475064730907। इस स्थिति में -0.6284750647 कास्ट ठीक है। जब तक मेरे पास 10 दशमलव स्थान नहीं हैं तब तक मुझे फ्लोट के अंत में शून्य जोड़ने के लिए मूल रूप से मेरे परिणाम की आवश्यकता होती है।

+0

शायद मैं इस सवाल का जवाब मिल गया। http://stackoverflow.com/questions/34316871/how-can-the-following-result-of-casting-from-float-to-numeric-be-explained –

उत्तर

8

आप दशमलव स्थानों वापस जोड़ने के लिए दौर में एक बार कास्ट करने के लिए, और एक बार की जरूरत है (अन्य तरीके STRROUND आदि का उपयोग कर, भी कर रहे हैं, निश्चित रूप से,):

DECLARE @c TABLE(x FLOAT); 

INSERT @c SELECT 280712929.22; 
INSERT @c SELECT 364322379.5731; 
INSERT @c SELECT 10482308902; 

SELECT x, 
    d = CONVERT(DECIMAL(28,10), x), 
    rd = CONVERT(DECIMAL(28,10), CONVERT(DECIMAL(28,4), x)) 
FROM @c; 

परिणाम:

x    d      rd 
-------------- ---------------------- ---------------------- 
280712929.22 280712929.2200000300 280712929.2200000000 
364322379.5731 364322379.5730999700 364322379.5731000000 
10482308902  10482308902.0000000000 10482308902.0000000000 

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

+0

दशमलव संख्याओं की संख्या भिन्न हो सकती है, कम से कम यह है क्या मुझे लगता है कि। –

+0

जो एक डिग्री में मदद करता है।हालांकि, इसका मतलब है कि मैं फ्लोट्स के अंकों को बंद कर दूंगा जहां मेरे पास वास्तव में पहले स्थान पर 4 से अधिक दशमलव स्थान हैं, यानी: 517822.18109027। स्पष्टीकरण के लिए पोस्ट संपादित करेंगे। –

+2

यदि आपको सशर्त रूप से यह तय करना है कि उस पंक्ति में मूल्य के आधार पर प्रत्येक पंक्ति पर कितने दशमलव स्थान दिखाना है, तो मुझे लगता है कि आप स्ट्रिंग पार्सिंग/स्वरूपण क्षेत्र में पार हो रहे हैं। यह शायद प्रस्तुति परत पर किया गया है, डेटाबेस में नहीं। –

1

मुझे यकीन नहीं है कि यह नेक्रोप्रोस्टिंग के अंतर्गत आता है, लेकिन मुझे हाल ही में एक ही समस्या थी इसलिए मैंने सोचा कि मैं पोस्ट कर सकता हूं।

यह पाप के रूप में बदसूरत हो सकता है, लेकिन काम करना प्रतीत होता है (ऊपर हारून की प्रतिक्रिया से संशोधित)।

DECLARE @myTable TABLE(x FLOAT); 

INSERT INTO @myTable VALUES 
    (280712929.22), 
    (364322379.5731), 
    (10482308902), 
    (-0.628475064730907); 

SELECT x, 
     d = CONVERT(DECIMAL(28,10), x),     
     NewDec = CONVERT(DECIMAL(28,10),   
         CONVERT(DECIMAL(16,15), 
           LEFT(CONVERT(VARCHAR(50), x, 2),17)) 
         * POWER(CONVERT(DECIMAL(38,19),10), 
           RIGHT(CONVERT(varchar(50), x,2),4)))      
FROM @myTable; 

परिणाम:

x     d      NewDec 
------------------ ---------------------- ---------------------- 
280712929.22  280712929.2200000300 280712929.2200000000 
364322379.5731  364322379.5731000300 364322379.5731000000 
10482308902   10482308902.0000000000 10482308902.0000000000 
-0.628475064730907 -0.6284750647   -0.6284750647 
संबंधित मुद्दे