2011-07-21 19 views
6

समस्या हमारे पास निम्न दो बयान करने के लिए कम हो जाता है:टीएसक्यूएल दौर() असंगतता?

select convert(float, (convert(float,5741.61)/convert(float, 196.00)) * convert(float,14.00)) as unrounded, round(convert(float, (convert(float,5741.61)/convert(float, 196.00)) * convert(float,14.00)), 2) as roundedTo2dp 

select convert(float, 410.115) as unrounded, ROUND(convert(float, 410.115), 2) as roundedTo2dp 

पहले बयान तैरता का उपयोग करता 410.115 के एक मूल्य, और भी 2 दशमलव स्थानों के लिए एक दौर() के साथ है कि परिणाम की गणना करने के लिए। गोलाकार मूल्य 410.11 पर आता है।

दूसरा कथन फ्लोट वैल्यू 410.115 का उपयोग करता है और इसे 2 दशमलव स्थानों तक भी गोल करता है। गोलाकार परिणाम 410.12 के रूप में आता है।

एक गोल क्यों हो रहा है और दूसरा गोलाकार हो रहा है जब मूल्य इसे गोल किया जा रहा है?

मैं 410.12 के लिए पहला कथन कैसे प्राप्त कर सकता हूं?

संपादित करें: स्वरूपण के लिए माफ़ी - स्टैक ओवरफ्लो इस मशीन पर कोई स्वरूपण नहीं दिखा रहा है (बहुत विषम)।

उत्तर

5

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

select convert(decimal(18,2), (convert(decimal(18,2),5741.61)/convert(decimal(18,2), 196.00)) * convert(decimal(18,2),14.00)) as unrounded, round(convert(decimal(18,2), (convert(decimal(18,2),5741.61)/convert(decimal(18,2), 196.00)) * convert(decimal(18,2),14.00)), 2) as roundedTo2dp 

परिणामों में

unrounded roundedTo2dp 
410.12  410.12 

दशमलव के बारे में MSDN से लिंक करें। http://msdn.microsoft.com/en-us/library/ms187746.aspx

आशा है कि मदद करता है ...

4

संख्या बराबर नहीं हैं:

SELECT CAST(convert(float, (convert(float,5741.61)/convert(float, 196.00)) * convert(float,14.00)) AS BINARY(8)) 
UNION ALL 
SELECT CAST(convert(float, 410.115) AS BINARY(8)) as bin 

---- 
0x4079A1D70A3D70A3 
0x4079A1D70A3D70A4 
2

'नाव' एक अनुमानित संख्या डेटा प्रकार है और इसलिए नहीं डेटा प्रकार रेंज में सभी मान ठीक वैसे ही प्रदर्शित किया जा सकता है।

यह http://msdn.microsoft.com/en-us/library/ms173773.aspx पर आधारित है।

मेरा मानना ​​है कि फ्लोट वैल्यू का उपयोग करते समय गोल करने का मुद्दा यही है। आप 100% निश्चित नहीं हो सकते!

पूर्व। राउंड का चयन करें (कन्वर्ट करें (फ्लोट, 1.5555), 2) - लाइव 1.56

राउंड का चयन करें (कन्वर्ट (फ्लोट, 1.555), 2) - लाइव 1.55!

इस तरह की एक साधारण संख्या के साथ फ्लोट का उपयोग करते समय अपेक्षित परिणाम में अंतर होता है।

संबंधित मुद्दे