двойной минус двойной дает точность задач - PullRequest
8 голосов
/ 30 апреля 2010

Я столкнулся с проблемой точности в double в .NET. Я думал, что это применимо только к float, но теперь я вижу, что double - это float.

double test = 278.97 - 90.46;
Debug.WriteLine(test) //188.51000000000005

//correct answer is 188.51

Как правильно справиться с этим? Круглый? Отбросить ненужные десятичные разряды?

Ответы [ 2 ]

10 голосов
/ 30 апреля 2010

Используйте тип данных десятичный . «Тип десятичного значения подходит для финансовых расчетов, требующих большого числа значных целых и дробных цифр и без ошибок округления».

5 голосов
/ 30 апреля 2010

Это происходит на многих языках и проистекает из того факта, что мы обычно не можем хранить двойные или плавающие числа точно в цифровом оборудовании. Для подробного объяснения того, как двойные числа, числа с плавающей запятой и все другие значения с плавающей запятой часто хранятся, посмотрите на различные спецификации IEEE, описанные в Википедии. Например: http://en.wikipedia.org/wiki/Double_precision

Конечно, есть и другие форматы, например, формат с фиксированной запятой. Но эта неточность есть в большинстве языков, и поэтому вам часто нужно использовать эпсилон-тесты вместо тестов на равенство при использовании двойных в условных выражениях (то есть abs (x-y)

Как вы справляетесь с этой неточностью, зависит от вас и зависит от вашего заявления.

...