Числовой тип с достаточной точностью для реализации калькулятора - PullRequest
1 голос
/ 24 января 2012

Я создаю приложение калькулятора WPF, и во время его тестирования (по сравнению с поведением встроенного калькулятора Windows) я увидел некоторые различия.

Вот распечатка из одного из моих тестов:

Сбой теста 'Comparison.Tests.ComparisonTests':

Ожидаемая длина строки 17, но равная 16. Строки различаются по индексу 16.
Ожидается: "175641.7874709774"
Нобыло: "175641.787470977"

Я использую double для всех моих вычислений и, наконец, отображаю их в виде строки в TextBox.

В чем причинаэтой разницы?двойного недостаточно для хранения результатов основных операций (сложение, умножение, вычитание, деление, SQRT и т. д.).

Ответы [ 5 ]

4 голосов
/ 24 января 2012

Двойного достаточно, если вы готовы принять его ограничения (15-16 цифр точности).

Если вы используете Windows Calculator в качестве золотого стандарта, вы должны знать, что он невнутренне используйте Double - он был переписан в Windows 95 для использования арифметической библиотеки произвольной точности.За сообщение в блоге Раймонда Чена :

Сегодня внутренние вычисления Calc выполняются с бесконечной точностью для основных операций (сложение, вычитание, умножение, деление) и 32-значной точностьюдля сложных операций (квадратный корень, трансцендентные операторы).

Большинству приложений не требуется более 15 цифр точности.Если у вас есть, вам нужно найти библиотеку, которая поддерживает математику произвольной точности.

1 голос
/ 24 января 2012

Я предлагаю использовать десятичную.

Почему?

В отличие от типов данных float и double, десятичных дробных числа, такие как 0,1, могут быть представлены точно в десятичном виде представление. В поплавке и двойных представлениях такие числа часто бесконечные дроби, что делает эти представления более склонными для округления ошибок.

И хороший ресурс об арифметических операциях: Что должен знать каждый специалист по вычислительной технике об арифметике с плавающей точкой

1 голос
/ 24 января 2012

Тип Double обеспечивает точность порядка 15 десятичных цифр, поэтому похоже, что вы столкнулись с этим ограничением. Decimal использует 128 бит вместо 64 бит, как Double, так что это даст вам большую точность в аналогичном диапазоне.

1 голос
/ 24 января 2012

Используйте decimal тип.У него больше точности. Проверьте это для более подробной информации.

0 голосов
/ 24 января 2012

Double даст вам 53 бита точности (52 бита в 64-битном значении, с неявным дополнительным битом для большинства значений).

Десятичное число даст вам 96 бит точности (в 128-битном значении).

То, что показатель степени в двоичном виде, а в последнем - десятичное, означает, что «круглые» числа в двойных числах могут быть более удивительными для пользователей, чем в десятичных.

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

Скорее всего, десятичная дробь будет служить намного лучше двойной. Если вам нужна еще большая точность, вы можете бросить свой собственный большой десятичный знак, комбинируя BigInteger и число для хранения шкалы.

...