десятичный против двойного!- Какой из них мне следует использовать и когда?[дубликат]

StackOverflow https://stackoverflow.com/questions/1165761

Вопрос

На этот вопрос уже есть ответ здесь:

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

Это было полезно?

Решение

За деньги, всегда десятичный.Вот почему он был создан.

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

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

Другие советы

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

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

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

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

десятичная дробь, десятичная дробь, десятичная дробь

Не принимайте никаких заменителей.

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

Система.Единый / плавать - 7 цифр
Система.Двойная / двойной - 15-16 цифр
Система.Десятичная / десятичная дробь - 28-29 значащих цифр

То, как я был уязвлен, используя неправильный тип (добрых несколько лет назад), связано с большими суммами:

  • £ 520,532.52 - 8 цифр
  • £1,323,523.12 - 9 цифр

У вас заканчивается 1 миллион за поплавок.

15-значная денежная стоимость:

  • £1,234,567,890,123.45

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

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

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

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

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

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

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

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

Вот пример в коде 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

Я думаю, что основное отличие помимо разрядности заключается в том, что десятичное число имеет основание экспоненты 10, а двойное - 2

http://software-product-development.blogspot.com/2008/07/net-double-vs-decimal.html

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top