Подтвердить что ты не робот

Как решить, что использовать - double или decimal?

Возможный дубликат:
decimal vs double! - Кого я должен использовать и когда?

Я использую тип double для цены в своем торговом программном обеспечении. Я заметил, что иногда возникают нечетные ошибки. Они возникают, если цена содержит 4 цифры после "точки", например, 2.1234.

Когда я отправил из своей программы "2.1234" в рыночном порядке по цене "2.1235".

Я не использую decimal, потому что мне не нужна "экстремальная" точность. Мне не нужно отличать для примера "2.00000000003" от "2.00000000002". Мне нужно максимум 6 цифр после точки.

Вопрос - где линия? Когда использовать decimal?

Должен ли я использовать decimal для любых финансовых операций? Даже если мне нужна только одна цифра после точки? (1.1 1.2 и т.д.)

Я знаю, что decimal довольно медленный, поэтому я бы предпочел использовать double, если не требуется decimal.

4b9b3361

Ответ 1

Используйте десятичное значение, когда вы имеете дело с количествами, которые вы хотите (и можете) точно представить в базе-10. Это включает денежные значения, потому что вы хотите, чтобы 2.1234 отображалось точно как 2.1234.

Используйте double, если вам не нужно точное представление в базе 10. Обычно это удобно для обработки измерений, поскольку они уже являются приблизительными, а не точными величинами.

Конечно, если наличие или отсутствие точного представления в базе 10 не важно для вас, учитываются другие факторы, которые могут или не могут иметь значения в зависимости от конкретной ситуации:

  • double имеет больший диапазон (он может обрабатывать очень большие и очень маленькие величины);
  • decimal имеет более высокую точность (имеет более значимые цифры);
  • вам может потребоваться использовать double для взаимодействия с некоторыми более старыми API-интерфейсами, которые не знают о десятичной системе;
  • double быстрее десятичного;
  • decimal имеет больший объем памяти;

Ответ 2

Когда точность нужна и важна, используйте decimal.

Если точность не так важна, вы можете использовать double.

В вашем случае вы должны использовать decimal в качестве своего финансового вопроса.

Ответ 3

Используйте decimal, который он построил для представления степеней 10 колодцев (т.е. цены).

Ответ 4

Для финансовой операции я всегда использую десятичный тип

Ответ 5

Десятичный путь - это путь, когда вы имеете дело с ценами.

Ответ 6

Если это финансовое программное обеспечение, вы, вероятно, должны использовать десятичное число. Эта статья wiki довольно хорошо выглядит.

Ответ 7

Простой ответ в этом примере:

decimal d = 0.3M+0.3M+0.3M;
            bool ret = d == 0.9M; // true
            double db = 0.3 + 0.3 + 0.3;
            bool dret = db == 0.9; // false

тест с двойным сбоем, так как 0,3 в его двоичном представлении (база 2) является периодическим, поэтому вы теряете точность, десятичная цифра представлена ​​BCD, поэтому база 10, и вы неожиданно потеряли значительную цифру. К сожалению, Десятичные числа значительно медленнее, чем в два раза. Обычно мы используем десятичную для финансового расчета, где необходимо учитывать любую цифру, чтобы избежать допуска, double/float для разработки.

Ответ 8

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

Ответ 9

Существует Разъяснение этого вопроса на MSDN

Ответ 10

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

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

Десятичное число также "запоминает", сколько цифр оно имеет, например. даже если десятичное 1.230 равно 1.23, первое все еще знает о завершающем ноле и может отображать его, если отформатирован как текст.

Ответ 11

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

Самый простой способ использования фиксированной точки - просто сохранить номер в int из тысячи частей. Например, если цена всегда имеет 2 десятичных знака, вы должны были бы сэкономить сумму центов (12,45 доллара хранится в int со значением 1245, что, таким образом, будет составлять 1245 центов). С четырьмя десятичными знаками вы будете хранить куски по десять тысяч (12.3456 будет храниться в int со значением 123456, представляющим 123456 десятитысячных) и т.д. И т.д.

Недостатком этого является то, что вам иногда понадобится преобразование, если, например, вы умножаете два значения вместе (0.1 * 0.1 = 0.01 while 1 * 1 = 1, единица изменилась с десятых до сотых). И если вы собираетесь использовать некоторые другие математические функции, вам также необходимо учитывать такие вещи.

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