2013-11-01 3 views
0

За последние 2 дня я делал много чтения о десятичной и двойной о округлении.Технический анализ C# Math.Round

Что бы я хотел знать, знает ли кто-нибудь, как работает Math.Round под обложками? Как это делает преобразование в биты, затем округление на этих битах или округление первого и т. Д.? Импортирует или выполняет какой-либо собственный код, который выполняет округление? и т. д.

Если у кого-либо есть технические документы или ссылки, это было бы замечательно!

+0

Прочитайте [исходный код] (http://www.dotnetframework.org/default.aspx/Net/Net/[email protected]@[email protected]/DEVDIV/depot/DevDiv/releases/whidbey/ netfxsp/NDP/CLR/SRC/BCL/System/Math @ CS/1/Math @ CS). –

+0

Если вы получаете IL Spy, декомпилируйте DLL и посмотрите сами. –

ответ

1

Взятый с mscorlib.dll с помощью декомпилятора. Обратите внимание, что есть ряд других вызовов, которые важны. Я предлагаю получить декомпилятор и самостоятельно пройти через него. Приветствия

[__DynamicallyInvokable] 
[SecuritySafeCritical] 
public static extern double Round(double a); 

[__DynamicallyInvokable] 
public static double Round(double value, int digits) 
{ 
    if (digits < 0 || digits > 15) 
    { 
     throw new ArgumentOutOfRangeException("digits", Environment.GetResourceString("ArgumentOutOfRange_RoundingDigits")); 
    } 
    return Math.InternalRound(value, digits, MidpointRounding.ToEven); 
} 


[SecuritySafeCritical] 
private static double InternalRound(double value, int digits, MidpointRounding mode) 
{ 
    unsafe 
    { 
     if (Math.Abs(value) < Math.doubleRoundLimit) 
     { 
      double num = Math.roundPower10Double[digits]; 
      value = value * num; 
      if (mode != MidpointRounding.AwayFromZero) 
      { 
       value = Math.Round(value); 
      } 
      else 
      { 
       double num1 = Math.SplitFractionDouble(ref value); 
       if (Math.Abs(num1) >= 0.5) 
       { 
        value = value + (double)Math.Sign(num1); 
       } 
      } 
      value = value/num; 
     } 
     return value; 
    } 
} 
+1

Я только что декомпилировал Math.Round, используя JustDecompile, и я заметил, что theres объявляет объявление Round Round, помеченное как extern. Насколько мне известно, это означает, что метод реализован извне, знаете ли вы, из какой библиотеки из этого метода? – h4ck3r8ug5

+0

Посмотрите здесь http://stackoverflow.com/questions/8870442/how-is-math-pow-implemented-in-net-framework, хотя речь идет о военнопленных и применима к Round. – Nico

Смежные вопросы