मुझे लगता है कि, सी # में, decimal
को गोल करके, डिफ़ॉल्ट रूप से MidpointRounding.ToEven
का उपयोग करता है। यह उम्मीद की जाती है, और सी # spec dictates क्या है। हालांकि, यह देखते हुए निम्नलिखित:.NET दशमलव.ToString (स्ट्रिंग) शून्य से दूर क्यों है, स्पष्ट रूप से भाषा spec के साथ असंगत है?
- एक
decimal dVal
- एक प्रारूप
string sFmt
है कि, जबdVal.ToString(sFmt)
करने के लिए पारित किया है,dVal
का पूर्ण बनाया गया संस्करण से युक्त एक स्ट्रिंग में परिणाम होगा ... यह है स्पष्ट है कि decimal.ToString(string)
MidpointRounding.AwayFromZero
का उपयोग करके एक मान गोल किया गया है। यह सी # spec का प्रत्यक्ष विरोधाभास प्रतीत होता है।
मेरा प्रश्न यह है: क्या ऐसा कोई अच्छा कारण है? या यह भाषा में सिर्फ एक असंगतता है?
नीचे, संदर्भ के लिए, मैं कुछ कोड है कि गोलाई आपरेशन के परिणाम और decimal.ToString(string)
आपरेशन के परिणाम, decimal
मूल्यों की एक सरणी में हर मूल्य पर प्रत्येक के वर्गीकरण सांत्वना देने लिखते शामिल किया है। वास्तविक आउटपुट एम्बेडेड हैं। इसके बाद, मैंने decimal
प्रकार पर सी # भाषा विशिष्टता अनुभाग से प्रासंगिक अनुच्छेद शामिल किया है।
उदाहरण कोड:
static void Main(string[] args)
{
decimal[] dArr = new decimal[] { 12.345m, 12.355m };
OutputBaseValues(dArr);
// Base values:
// d[0] = 12.345
// d[1] = 12.355
OutputRoundedValues(dArr);
// Rounding with default MidpointRounding:
// Math.Round(12.345, 2) => 12.34
// Math.Round(12.355, 2) => 12.36
// decimal.Round(12.345, 2) => 12.34
// decimal.Round(12.355, 2) => 12.36
OutputRoundedValues(dArr, MidpointRounding.ToEven);
// Rounding with mr = MidpointRounding.ToEven:
// Math.Round(12.345, 2, mr) => 12.34
// Math.Round(12.355, 2, mr) => 12.36
// decimal.Round(12.345, 2, mr) => 12.34
// decimal.Round(12.355, 2, mr) => 12.36
OutputRoundedValues(dArr, MidpointRounding.AwayFromZero);
// Rounding with mr = MidpointRounding.AwayFromZero:
// Math.Round(12.345, 2, mr) => 12.35
// Math.Round(12.355, 2, mr) => 12.36
// decimal.Round(12.345, 2, mr) => 12.35
// decimal.Round(12.355, 2, mr) => 12.36
OutputToStringFormatted(dArr, "N2");
// decimal.ToString("N2"):
// 12.345.ToString("N2") => 12.35
// 12.355.ToString("N2") => 12.36
OutputToStringFormatted(dArr, "F2");
// decimal.ToString("F2"):
// 12.345.ToString("F2") => 12.35
// 12.355.ToString("F2") => 12.36
OutputToStringFormatted(dArr, "###.##");
// decimal.ToString("###.##"):
// 12.345.ToString("###.##") => 12.35
// 12.355.ToString("###.##") => 12.36
Console.ReadKey();
}
private static void OutputBaseValues(decimal[] dArr)
{
Console.WriteLine("Base values:");
for (int i = 0; i < dArr.Length; i++) Console.WriteLine("d[{0}] = {1}", i, dArr[i]);
Console.WriteLine();
}
private static void OutputRoundedValues(decimal[] dArr)
{
Console.WriteLine("Rounding with default MidpointRounding:");
foreach (decimal d in dArr) Console.WriteLine("Math.Round({0}, 2) => {1}", d, Math.Round(d, 2));
foreach (decimal d in dArr) Console.WriteLine("decimal.Round({0}, 2) => {1}", d, decimal.Round(d, 2));
Console.WriteLine();
}
private static void OutputRoundedValues(decimal[] dArr, MidpointRounding mr)
{
Console.WriteLine("Rounding with mr = MidpointRounding.{0}:", mr);
foreach (decimal d in dArr) Console.WriteLine("Math.Round({0}, 2, mr) => {1}", d, Math.Round(d, 2, mr));
foreach (decimal d in dArr) Console.WriteLine("decimal.Round({0}, 2, mr) => {1}", d, decimal.Round(d, 2, mr));
Console.WriteLine();
}
private static void OutputToStringFormatted(decimal[] dArr, string format)
{
Console.WriteLine("decimal.ToString(\"{0}\"):", format);
foreach (decimal d in dArr) Console.WriteLine("{0}.ToString(\"{1}\") => {2}", d, format, d.ToString(format));
Console.WriteLine();
}
सी # भाषा विशिष्टता ("दशमलव प्रकार") की धारा 4.1.7 से पैरा (पूर्ण कल्पना here (.doc प्राप्त)):
टाइप दशमलव के मानों पर एक ऑपरेशन का परिणाम वह है जो सटीक परिणाम (प्रत्येक ऑपरेटर के लिए परिभाषित स्केल को संरक्षित करना) की गणना करने के बाद होता है और फिर प्रतिनिधित्व को फिट करने के लिए गोल करता है। परिणाम निकटतम प्रतिनिधित्व योग्य मूल्य के लिए गोल किए जाते हैं, और, जब परिणाम दो प्रतिनिधित्व योग्य मानों के बराबर होता है, उस मूल्य के लिए जिसमें कम से कम महत्वपूर्ण अंक स्थिति में भी संख्या होती है (इसे "बैंकर राउंडिंग" के रूप में जाना जाता है)। शून्य परिणाम में हमेशा 0 का संकेत होता है और 0.
यह देखना आसान है कि वे इस पैराग्राफ में ToString(string)
पर विचार नहीं कर रहे हैं, लेकिन मुझे लगता है कि यह इस विवरण में फिट बैठता है।
यह संभव है कि आपको यह समझना चाहिए कि सी # में 'ToString (string)' विधि नहीं है। .NET Framework करता है। मुझे यकीन नहीं है कि .NET Framework किसी भी विशेष प्रोग्रामिंग भाषा के नियमों का पालन करने के लिए बाध्य है। –