Присваивать и вычислять с помощью экспоненциальной нотации

#c# #visual-studio-2010 #floating-point #scientific-notation

#c# #visual-studio-2010 #с плавающей запятой #научная нотация

Вопрос:

Вы когда-нибудь наблюдали это явление:

Если я попытаюсь вычислить следующее вычисление в ImmediateWindow Visual Studio 2010 C # .Net, я получу это странное решение.

 1E-9 * 100 = 0.00000010000000000000001
1E-9 * 1E 2 = 0.00000010000000000000001
  

Даже если я выполняю вычисления таким образом:

 double val = 1E-9;
0.000000001
val = val * 100;
0.00000010000000000000001
  

Если я вычислю то же самое вычисление в Windows calc, я получу ожидаемый результат:

 1E-9 * 100 = 0,0000001
  

Если кто-то что-то знает об этом поведении, я был бы очень рад получить информацию.

Комментарии:

1. Может быть, калькулятор Windows просто не использует удвоения? Почему вы предполагаете, что они должны иметь одинаковую точность?

2. Вас интересует поведение 0.00000010000000000000001 , которое является результатом попытки сохранить десятичные цифры в двоичных компьютерах (и на него уже много раз давался ответ), или тот факт, что Windows Calc выполняет это правильно, когда другие ошибаются?

Ответ №1:

Не имеет значения, используете вы экспоненциальную нотацию или нет, вы просто работаете с точностью до плавающей запятой. Если вы хотите большей точности, используйте десятичную систему счисления, например:

 decimal val = 1E-9;
0.000000001
val = val * 100;
0.0000001
  

Посмотрите, что каждый специалист по информатике должен знать об арифметике с плавающей запятой