двойной в .net - PullRequest
       14

двойной в .net

2 голосов
/ 23 октября 2008

Если у меня есть следующий код (это было написано в .NET)

double i = 0.1 + 0.1 + 0.1;

Почему i не равно 0.3?
Есть идеи?

Ответы [ 7 ]

6 голосов
/ 23 октября 2008

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

Вот почему в сравнении вы склонны видеть:

if (abs(a-b) < epsilon) { ...

где эпсилон - это небольшое значение, например 0,00000001, в зависимости от требуемой точности.

3 голосов
/ 23 октября 2008

Double - это 64-битный тип данных с плавающей запятой. Хранит десятичные дроби как приблизительные значения. Если вам нужны точные значения, используйте тип данных Decimal, который имеет тип данных Binary Coded Decimal .

1 голос
/ 23 октября 2008

У Джона Скита очень хорошее прохождение этого здесь , и то же самое для decimal здесь .

1 голос
/ 23 октября 2008

Двойной расчет не точен. У вас есть два решения:

  • Используйте тип Decimal, который является точным
  • Сравните абс (я - 0,3)
1 голос
/ 23 октября 2008

Равенство с числами с плавающей запятой часто не используется, потому что всегда есть проблема с представлением. Обычно мы сравниваем разницу между двумя числами с плавающей запятой и, если она меньше определенного значения (например, 0,0000001), она считается равной.

1 голос
/ 23 октября 2008

Точность арифметики с плавающей запятой не может быть гарантирована.

...