Двойная точность

У меня есть код, и я его не понимаю. Я разрабатываю приложение, точность которого очень важна. но это не важно для .NET, почему? Я не знаю.

double value = 3.5;
MessageBox.Show((value + 1 * Math.Pow(10, -20)).ToString());

но в окне сообщения отображается: 3.5 Пожалуйста, помогите мне, спасибо.


person Hossein Margani    schedule 16.05.2009    source источник


Ответы (5)


У вас может быть точность, но это зависит от того, что еще вы хотите сделать. Если вы поместите следующее в консольное приложение:

double a = 1e-20;
Console.WriteLine(" a  = {0}", a);
Console.WriteLine("1+a = {0}", 1+a);

decimal b = 1e-20M;
Console.WriteLine(" b  = {0}", b);
Console.WriteLine("1+b = {0}", 1+b);

Ты получишь

 a  = 1E-20
1+a = 1
 b  = 0,00000000000000000001
1+b = 1,00000000000000000001

Но обратите внимание, что функция Pow, как и почти все в классе Math, принимает только двойные числа:

double Pow(double x, double y);

Таким образом, вы не можете взять синус десятичного числа (кроме того, преобразовав его в двойное)

Также см. этот вопрос.

person Henk Holterman    schedule 16.05.2009


Точность Double составляет 15 цифр (17 цифр внутри). Значение, которое вы вычисляете с помощью Math.Pow, правильное, но когда вы добавляете его к value, оно слишком мало, чтобы что-то изменить.

Изменить:
Decimal может обрабатывать эту точность, но не вычисления. Если вам нужна такая точность, вам нужно выполнить расчет, а затем преобразовать каждое значение в Decimal, прежде чем складывать их вместе:

double value = 3.5;
double small = Math.Pow(10, -20);

Decimal result = (Decimal)value + (Decimal)small;

MessageBox.Show(result.ToString());
person Guffa    schedule 16.05.2009
comment
но что мне делать с этим номером? - person Hossein Margani; 17.05.2009
comment
Десятичное число имеет эту точность, но вы должны выполнить расчет как двойное число, а затем преобразовать каждое в десятичное число перед их добавлением. См. мое редактирование выше. - person Guffa; 17.05.2009

Или используйте тип Decimal, а не двойной.

person Colin Desmond    schedule 16.05.2009
comment
Но вы не можете использовать Math.Pow() для десятичных знаков - person Henk Holterman; 17.05.2009
comment
10^-20 можно легко задать как константу. Здесь нет необходимости вызывать Math.Pow(). - person Joey; 17.05.2009

Двойная точность означает, что он может содержать 15-16 цифр. 3,5 + 1e-20 = 21 цифра. Его нельзя представить с двойной точностью. Вы можете использовать другой тип, например, десятичный.

person Kcats    schedule 16.05.2009
comment
Всего 15-16 цифр. Плавающая точка может быть где угодно до, после или между этими цифрами. - person Kcats; 18.05.2009