Вопрос

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

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

но в окне сообщения отображается:3.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);

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

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

Другие советы

Если вы делаете что-то, где точность очень важна, вам нужно знать об ограничениях операций с плавающей запятой.Хорошая ссылка это Дэвид Голдберг «Что должен знать каждый ученый-компьютерщик об арифметике с плавающей запятой».

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

Точность 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());

Или используйте Десятичная дробь введите, а не двойной.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top