Умножение двойного числа на 100 в С# приводит к неожиданному ответу

Возможный дубликат:
C# Math дает неверные результаты!

У меня есть следующий код в моем проекте приложения Windows на С#:

двойной тест = 2,24*100;

Если я добавлю часы для тестирования, можно было бы ожидать, что значение будет 224, однако на самом деле это: 224.00000000000003

Кто-нибудь может объяснить, откуда взялся лишний .00000000000003?


person user966893    schedule 27.09.2011    source источник
comment
Обязательные ссылки: download.oracle.com/docs/cd /E19957-01/806-3568/ и en.wikipedia.org/wiki/ IEEE_754-2008   -  person LukeH    schedule 27.09.2011
comment
Вы умножаете двойные, а не десятичные числа (как в предварительном редактировании заголовка).   -  person BoltClock    schedule 27.09.2011
comment
То же самое происходит со мной. Я бы предположил какое-то отклонение округления.   -  person Jonas B    schedule 27.09.2011
comment
Вот программа, которую я написал, которая поможет вам понять, почему 2,24 на самом деле не является значением 2,24. blogs.msdn.com/ b/ericlippert/archive/2011/02/17/. См. также blogs.msdn.com/b/ericlippert/archive /tags/ (начинайте снизу), если эта тема вас интересует.   -  person Eric Lippert    schedule 27.09.2011


Ответы (5)


Умножение десятичной дроби на 100 в С# приводит к неожиданному ответу

Во-первых, вы не умножали десятичное число — вы умножали число с плавающей запятой IEEE 754 на 100.

Потому что 2.24 не существует как double. Однако, если вы сделаете:

decimal test = 2.24M * 100;

он будет вести себя так, как вы ожидаете.

person Marc Gravell    schedule 27.09.2011

Это поведение задумано, так работают числа с плавающей запятой - точность на самом деле ограничена. См. раздел Числа с плавающей точкой — проблемы с точностью.

person Roman R.    schedule 27.09.2011

Это ошибка округления, не все числа могут быть представлены точно в double

person Henk Holterman    schedule 27.09.2011

Многие другие уже объяснили это гораздо более красноречиво, чем я. Попробуйте эти ссылки для размера:

Простое объяснение

Расширенное объяснение

Если это все еще заставляет вас чесать голову, просто ‹вставьте любимую поисковую систему› для «Что каждый программист должен знать об арифметике с плавающей запятой».

person hollystyles    schedule 27.09.2011

Вы получаете результат, потому что 2,24 не является точным числом. Помимо двух, которые вы указали, есть более значительные цифры. Я бы попробовал умножить на 100,00, а затем округлить число, используя только 3 значащие цифры.

Я должен уточнить, что вам нужно использовать десятичную переменную, а не двойную. Двойник не может представлять точное значение.

person Security Hound    schedule 27.09.2011