2011-11-22 18 views
8

मैं सी # और एसक्यूएल से ROUND फ़ंक्शन का उपयोग कर रहा हूं, और आश्चर्यजनक रूप से दोनों अलग-अलग परिणाम प्रदान कर रहे हैं।क्यों सी # दौर और एसक्यूएल दौर कार्य विभिन्न आउटपुट पैदा करते हैं?

एसक्यूएल में: ROUND(1250.00, -2) = 1300

दौर के साथ

सी # ROUND 1250 में और precision = 2 = 1200

किसी को भी इस स्थिति से पहले भर में आया है?

+0

जो डेटाबेस सर्वर का प्रयोग कर रहे ?? – Baz1nga

+0

यह भाषा दौर संख्याओं के बारे में सब कुछ है। जब आप मध्य में बैंग होते हैं तो आपका एसक्यूएल स्पष्ट रूप से यूपी और सी # राउंड को घुमाता है। मैं सुझाव देता हूं कि राउंड के अलावा कुछ और इस्तेमाल करने का प्रयास करें। एसक्यूएल राउंड में छत, लेकिन आप जो भी करने की कोशिश कर रहे हैं उस पर अधिक जानकारी के बिना वास्तव में यह उपयोग करना असंभव है कि इसका उपयोग किस पर किया जाए। –

+0

स्पष्टीकरण के लिए, सी # संख्याओं को गोल नहीं करता है; .NET बीसीएल करता है। –

उत्तर

7

सी # डिफ़ॉल्ट रूप से बैंकर के गोलाकार का उपयोग करता है, जहां आप बिल्कुल 5 अंक पर होते हैं, यह हमेशा गोल करने के बजाय निकटतम संख्या तक चलता है।

msdn article की टिप्पणी अनुभाग इस व्यवहार का वर्णन करता है। असल में यह गोल करने वाली त्रुटियों को कम करने के लिए होता है जब आप कई गोल संख्याओं को एक साथ जमा करते हैं।

0

अपनी संख्या को गोल करने के तरीके को निर्दिष्ट करने के लिए Math.Round, MidpointRounding पर पैरामीटर का उपयोग करें।

public enum MidpointRounding 
{ 
    // When a number is halfway between two others, it is rounded toward 
    // the nearest even number. 
    ToEven = 0, 

    // When a number is halfway between two others, it is rounded toward 
    // the nearest number that is away from zero. 
    AwayFromZero = 1, 
} 

आप इसे इस तरह से उपयोग कर सकते हैं:

int presicion = 2; 
double valueToRound; 

Math.Round(valueToRound/Math.Pow(10, precision), MidpointRounding.AwayFromZero) 
    * Math.Pow(10, precision); 
+0

मैंने इस पैरामीटर के साथ प्रयास किया लेकिन कोई उपयोग नहीं किया। अभी भी वही परिणाम प्राप्त हो रहा है :( –

1

पूर्णांकन में कठिन हिस्सा क्या दशमलव में 5 के साथ क्या करना है। वे वास्तव में बिल्कुल आधे रास्ते हैं, इसलिए वे एक टाई बनाते हैं। विकिपीडिया के राउंडिंग आलेख में tie-breaking के बारे में कुछ अच्छा है। अनिवार्य रूप से, सी # बैंकर के गोलाकार का उपयोग करता है जो आखिरी अनगिनत अंक तब भी होता है जब यह अजीब होता है। यह आईईईई मानक के अनुरूप है। इसके बजाय एसक्यूएल "हमेशा 5 राउंड अप" नियम का पालन करता है।

3

अगर आप http://msdn.microsoft.com/en-us/library/wyk4d9cy.aspx पढ़ते हैं, तो आप देखेंगे कि डिफ़ॉल्ट राउंडिंग है "दौर में भी" (बैंकर का गोलाई) जहां एसक्यूएल सर्वर के रूप में का उपयोग करने की "मानक"

गोलाई

अद्यतन एसक्यूएल सर्वर या तो सममित करता दिखाई देता है एक कस्टम राउंडिंग प्रक्रिया को लागू करें: अंकगणित गोलाई या सममित दौर नीचे (फिक्स) तर्क

पर निर्भर करता है कि कैसे समस्या को हल करने http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q196652&ID=KB;EN-US;Q196652

+0

समर्थन लिंक अब और काम नहीं करता है। एसक्यूएल में बैंकर के गोलाकार का एक कार्यान्वयन है [यहां] (http://blogs.lessthandot.com/index.php/datamgmt/datadesign/sql -server-गोलाई-तरीकों /) –