2015-03-10 3 views
-2

Я пытаюсь написать быстрый код для вычисления разных порядков величины 10. Должно быть довольно просто, но результаты немного странные. При вычислении 10^-6 вещей добавляется много дополнительных десятичных знаков. Результаты выглядят как это:Дополнительные цифры добавляются к двойному

  • 0,1
  • 0,01
  • 0,001
  • 0,0001
  • 0,00001
  • 0,0000010000000000000002

Вот код, я использую:

private Double CalculateOrderOfMagnitude(Int32 n) 
    { 
     if (n < 0) 
      return CalculateOrderOfMagnitude(n + 1)/10.0; 
     if (n > 0) 
      return CalculateOrderOfMagnitude(n - 1) * 10.0; 

     return 1.0d; 
    } 
+0

http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html – EZI

+0

Есть ли причина, вы возвращаете 'Double' вместо' Decimal' как в заголовке вопроса и теге? Кроме того, можно ли увидеть код, который на самом деле вызывает этот метод? – ryanyuyu

+0

Извините, я обновил заголовок соответствующим образом. Что касается кода, который фактически использует метод, он довольно прост, я просто беру результат вызова этого метода и умножаю его на другой номер. –

ответ

3

Поплавок и парные разряды несут ошибки округления из-за того, как они хранятся. Вы должны использовать десятичную цифру для поддержания точной точности.

http://en.wikipedia.org/wiki/Double-precision_floating-point_format

private decimal CalculateOrderOfMagnitude(int n) 
{ 
    if (n < 0) 
     return CalculateOrderOfMagnitude(n + 1)/10m; 
    if (n > 0) 
     return CalculateOrderOfMagnitude(n - 1) * 10m; 

    return 1m; 
} 
Смежные вопросы