Вопрос: Разница между десятичной, плавающей и двойной в .NET?


В чем разница между decimal, floatа также doubleв .NET?

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


1756


источник


Ответы:


floatа также doubleнаходятся плавающий двоичный типы точек , Другими словами, они представляют собой число, подобное этому:

10001.10010110011

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

decimalэто плавающий десятичная дробь тип точки , Другими словами, они представляют собой число, подобное этому:

12345.65789

Опять же, число и местоположение десятичная дробь точки оба закодированы в пределах значения - вот что делает decimalвсе же тип с плавающей точкой вместо типа фиксированной точки.

Важно отметить, что люди используются для представления нецелых чисел в десятичной форме и ожидают точных результатов в десятичных представлениях; не все десятичные числа точно представлены в двоичной с плавающей запятой - 0,1, например, поэтому, если вы используете двоичное значение с плавающей запятой, вы фактически получите приближение к 0,1. Вы также получите приближения при использовании плавающей десятичной точки - результат деления 1 на 3 не может быть точно представлен, например.

Что касается того, что использовать, когда:

  • Для значений, которые являются «естественно точными десятичными знаками», полезно использовать decimal, Это обычно подходит для любых понятий, изобретенных людьми: финансовые показатели являются наиболее очевидным примером, но есть и другие. Рассмотрим, например, оценку дайверам или фигуристам.

  • Для значений, которые являются более артефактами природы, которые не могут быть действительно измерены в точку так или иначе, float/ doubleявляются более подходящими. Например, научные данные обычно представляются в этой форме. Здесь исходные значения не будут «децимально точными» для начала, поэтому для ожидаемых результатов не важно поддерживать «десятичную точность». Плавающие двоичные точечные типы намного быстрее работают, чем десятичные.


1951



Точность - главное различие.

терка - 7 цифр (32 бит)

двойной -15-16 цифр (64 бит)

Десятичная дробь -28-29 значащих цифр (128 бит)

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

Десятичные числа и поплавки / парные пары не могут сравниваться без броска, тогда как Floats and Doubles могут. Десятичные числа также допускают кодирование или конечные нули.

float flt = 1F/3;
double dbl = 1D/3;
decimal dcm = 1M/3;
Console.WriteLine("float: {0} double: {1} decimal: {2}", flt, dbl, dcm);

Результат:

float: 0.3333333  
double: 0.333333333333333  
decimal: 0.3333333333333333333333333333

883



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

  • Определенная потеря точности приемлема во многих научных расчетах из-за практических пределов измеряемой физической проблемы или артефакта. Потеря точности не приемлема в финансах.
  • Десятичное число (намного) медленнее, чем float и double для большинства операций, в первую очередь потому, что операции с плавающей запятой выполняются в двоичном формате, тогда как десятичный материал выполняется в базе 10 (т.е. поплавки и удваиваются обрабатываются оборудованием FPU, например MMX / SSE , тогда как десятичные числа вычисляются в программном обеспечении).
  • Decimal имеет недопустимо меньший диапазон значений, чем двойной, несмотря на то, что он поддерживает больше цифр точности. Поэтому Decimal нельзя использовать для представления многих научных ценностей.

64



enter image description here

для получения дополнительной информации вы можете пойти в источник этой картины:

http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/921a8ffc-9829-4145-bdc9-a96c1ec174a5


54



float7 цифр точности

doubleимеет около 15 цифр точности

decimalимеет около 28 цифр точности

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

Я нашел это интересным. Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой


39



Никто не упомянул, что

В настройках по умолчанию Floats (System.Single) и double (System.Double) никогда не будут использовать   проверка переполнения, в то время как Decimal (System.Decimal) всегда будет использовать   проверка переполнения.

Я имею в виду

decimal myNumber = decimal.MaxValue;
myNumber += 1;

бросает OverflowException ,

Но это не так:

float myNumber = float.MaxValue;
myNumber += 1;

&

double myNumber = double.MaxValue;
myNumber += 1;

28



  1. Double and float can be divided by integer zero without an exception at both compilation and run time.
  2. Decimal cannot be divided by integer zero. Compilation will always fail if you do that.

24



I won't reiterate tons of good (and some bad) information already answered in other answers and comments, but I will answer your followup question with a tip:

When would someone use one of these?

Use decimal for counted values

Use float/double for measured values

Some examples:

  • money (do we count money or measure money?)

  • distance (do we count distance or measure distance? *)

  • scores (do we count scores or measure scores?)

We always count money and should never measure it. We usually measure distance. We often count scores.

* In some cases, what I would call nominal distance, we may indeed want to 'count' distance. For example, maybe we are dealing with country signs that show distances to cities, and we know that those distances never have more than one decimal digit (xxx.x km).


24



The Decimal, Double, and Float variable types are different in the way that they store the values. Precision is the main difference where float is a single precision (32 bit) floating point data type, double is a double precision (64 bit) floating point data type and decimal is a 128-bit floating point data type.

Float - 32 bit (7 digits)

Double - 64 bit (15-16 digits)

Decimal - 128 bit (28-29 significant digits)

The main difference is Floats and Doubles are binary floating point types and a Decimal will store the value as a floating decimal point type. So Decimals have much higher precision and are usually used within monetary (financial) or scientific calculation applications that require a high degree of accuracy. But in performance wise Decimals are slower than double and float types.

Decimal can 100% accurately represent any number within the precision of the decimal format, whereas Float and Double, cannot accurately represent all numbers, even numbers that are within their respective formats precision.

Decimal

In case of financial applications, or scientific calculations, it is better to use Decimal types because it gives you a high level of accuracy and easy to avoid rounding errors

Double

Double Types are probably the most normally used data type for real values, except handling money.

Float

It is used mostly in graphic libraries because very high demands for processing powers, also used situations that can endure rounding errors.


23