2012-05-04 3 views
1

Я работаю над чем-то, и у меня есть проблема, которую я не понимаю.Деление на 100 точность

double d = 95.24/(double)100; 
Console.Write(d); //Break point here 

Выход консоли 0,9524 (как и ожидалось), но если я смотрю на «D» после купирован программы она возвращает 0,95239999999999991.

Я пробовал все возможные варианты, и результат остается тем же. Проблема в том, что я использую 'd' в другом месте, и эта точная проблема заставляет мою программу работать.

Так почему же это так? Как я могу это исправить?

+1

Есть так много вопросов с номерами с плавающей запятой, как здесь, на SO –

+0

Угадайте формат по умолчанию Double.ToString показывает только 4 первых десятичных знака. Вы должны перейти к десятичному типу, если хотите точное представление (float и double не являются точными представлениями) –

ответ

6

http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems

Короткий этого является то, что число с плавающей точкой хранится в то, что составляет основу-2 научных обозначений. Существует целое значение, которое понимается как одно место перед десятичной точкой, которое выражается до цельной степени в два. Это позволяет хранить номера в относительно компактном формате; Недостатком является то, что преобразование от базового десяти к основанию 2 и обратно может привести к ошибке.

Чтобы уменьшить это значение, когда требуется высокая точность при малых значениях, используйте decimal вместо double; decimal - это 128-битный тип числа с плавающей запятой, разработанный с очень высокой точностью за счет уменьшения диапазона (он может представлять только числа до + - 79 неллион, 7,9E28 вместо double + 1,8E308; большинство неастрономических, нефизических компьютерных программ) и удваивают объем памяти двойника.

+0

+1 для ответа на оба вопроса: почему и как исправить –

7

Использовать decimal вместо двойного.

+0

Это работа! Большое спасибо ! – PuK

1

Вы могли бы использовать вместо decimal:

decimal d = 95.24/100m; 
Console.Write(d); //Break point here 
1

Try:

double d = Math.Round(95.24/(double)100, 4); 

Console.Write(d); 

редактировать: Или использовать десятичную, да. Я просто пытался сохранить ответ как можно более похожий на вопрос :)

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