Десятичное и двойное! - Кого я должен использовать и когда?

Я продолжаю наблюдать, как люди используют удвоение в С#. Я знаю, что я где-то читал, что удваивается, иногда теряют точность. Мой вопрос в том, когда следует использовать double и когда следует использовать десятичный тип? Какой тип подходит для расчета денег? (т.е. более 100 миллионов долларов)

Ответ 1

Для денег всегда десятичный. Это почему оно было создано.

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

Если точное значение чисел не важно, используйте double для скорости. Сюда входят вычисления графики, физики или других физических наук, где уже имеется "количество значимых цифр".

Ответ 2

Мой вопрос в том, когда следует использовать double и когда следует использовать десятичную тип?

decimal, когда вы работаете со значениями в диапазоне 10 ^ (+/- 28) и у вас есть ожидания относительно поведения на основе представлений базы 10 - в основном деньги.

double, когда вам нужна относительная точность (т.е. потеря точности в конечных цифрах по большим значениям не является проблемой) через совершенно разные величины - double охватывает более 10 ^ (+/- 300). Научные расчеты являются лучшим примером здесь.

какой тип подходит для денег вычисления?

десятичная, десятичная, десятичная

Не принимать замену.

Самый важный фактор заключается в том, что double, реализуемый как двоичная дробь, не может точно представлять многие фракции decimal (например, 0,1) вообще, и его общее количество цифр меньше, так как оно является 64-битным широм vs 128 бит для decimal. Наконец, финансовые приложения часто должны следовать определенным режима округления (иногда это предусмотрено законом). decimal поддерживает эти; double не работает.

Ответ 3

System.Single/float - 7 цифр
Система. Двойной/двойной - 15-16 цифр
System.Decimal/decimal - 28-29 значащих цифр

Я был ужален при использовании неправильного типа (добрых несколько лет назад) большим количеством:

  • £ 520 532,52 - 8 цифр
  • £ 1 323 523,12 - 9 цифр

Вы выбежали на 1 миллион для поплавка.

15-значное денежное значение:

  • £ 1,234,567,890,123.45

9 триллионов с удвоением. Но с делением и сравнениями все сложнее (я определенно не эксперт в области чисел с плавающей точкой и иррациональных чисел - см. Точку Марка). Смешивание десятичных и двойных вызывает проблемы:

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

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

Использование double вместо decimal для денежных приложений - это микрооптимизация - это самый простой способ, которым я на это смотрю.

Ответ 4

Десятичное значение для точных значений. Двойной для приблизительных значений.

USD: $12,345.67 USD (Decimal)
CAD: $13,617.27 (Decimal)
Exchange Rate: 1.102932 (Double)

Ответ 5

За деньги: decimal. Это стоит немного больше памяти, но не имеет проблем округления, например, double.

Ответ 6

Определенно использовать целые типы для ваших денежных расчетов. Это не может быть подчеркнуто достаточно, так как на первый взгляд может показаться, что тип с плавающей точкой является адекватным.

Вот пример кода python:

>>> amount = float(100.00) # one hundred dollars
>>> print amount
100.0
>>> new_amount = amount + 1
>>> print new_amount
101.0
>>> print new_amount - amount
>>> 1.0

выглядит довольно нормально.

Теперь попробуйте еще раз с 10 ^ 20 долларами Зимбабве

>>> amount = float(1e20)
>>> print amount
1e+20
>>> new_amount = amount + 1
>>> print new_amount
1e+20
>>> print new_amount-amount
0.0

Как вы можете видеть, доллар исчез.

Если вы используете целочисленный тип, он отлично работает:

>>> amount = int(1e20)
>>> print amount
100000000000000000000
>>> new_amount = amount + 1
>>> print new_amount
100000000000000000001
>>> print new_amount - amount
1