Разница между decimal, float и double in.NET?

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

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

18 ответов


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

10001.10010110011

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

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

12345.65789

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

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

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

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

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


точность является основным отличием.

Float - 7 цифр (32 бит)

двойной-15-16 цифр (64-разрядная версия)

Decimal -28-29 значащих цифр (128 бит)

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

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

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

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

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

enter image description here

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

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


float 7 цифр точности

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

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

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

Я нашел это интересным. Что Каждый Компьютер Ученый Должен Знать Об Арифметике С Плавающей Запятой


никто не упоминал об этом

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

Я имею в виду

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

закидываем OverflowException.

но это не так:

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

&

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

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

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

используйте decimal для пересчитать значения

используйте float/double для измеряемые значения

примеры:

  • деньги (мы считаем деньги или измеряем деньги?)

  • расстояние (мы считаем расстояние или измеряем расстояние? *)

  • баллы (мы подсчитываем баллы или измеряем баллы?)

мы всегда считаем деньги и никогда не должны измерять его. Обычно мы измеряем расстояние. Мы часто подсчитываем баллы.

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


типы переменных Decimal, Double и Float отличаются тем, как они хранят значения. Точность-это основное отличие, где float-это тип данных с плавающей запятой одиночной точности (32 бит), double-это тип данных с плавающей запятой двойной точности (64 бит), а decimal-128-битный тип данных с плавающей запятой.

Float-32 бит (7 цифр)

Double-64 бит (15-16 цифр)

Decimal-128 бит (28-29 значащих цифр)

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

Decimal может 100% точно представлять любое число в пределах точности десятичного формата, тогда как Float и Double, не могут точно представлять все числа, четные числа, которые находятся в пределах их точности форматы.

Decimal

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

двойной

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

плавание

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


  1. Double и float можно разделить на целое число ноль без исключения как во время компиляции, так и во время выполнения.
  2. Decimal нельзя разделить на целое число ноль. Компиляция всегда будет неудачной, если вы это сделаете.

целые числа, как уже упоминалось, являются целыми числами. Они не могут что-то запомнить .7, .42, а .007. Если вам нужно хранить числа, которые не являются целыми числами, вам нужен другой тип переменной. Можно использовать тип double или float. Вы устанавливаете эти типы переменных точно так же: вместо использования слова int вы типа double или float. Вот так:

float myFloat;
double myDouble;

(float сокращенно от "с плавающей запятой" и просто означает число с какой-то точкой на конце.)

разница между ними заключается в размере чисел, которые они могут содержать. Для float, вы можете иметь до 7 цифр в номере. Для doubles, Вы можете иметь до 16 цифр. Если быть более точным, вот официальный размер:

float:  1.5 × 10^-45  to 3.4 × 10^38  
double: 5.0 × 10^-324 to 1.7 × 10^308

float - 32-разрядное число, и double - 64-разрядное число.

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

double myDouble;
myDouble = 0.007;
MessageBox.Show(myDouble.ToString());

остановите программу и вернитесь в окно кодирования. Измените эту строку:

myDouble = 0.007;
myDouble = 12345678.1234567;

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


это была интересная тема для меня, так как сегодня у нас только что была неприятная маленькая ошибка, касающаяся decimal меньше точность, чем float.

в нашем коде C# мы читаем числовые значения из электронной таблицы Excel, преобразуя их в decimal, а затем отправить этот decimal вернуться к службе для сохранения в SQL Server


поплавок ~ ±1.5 x 10-45 к ±3.4 x 1038 --------7 цифры
двойной ~ ±5.0 x 10-324 до ±1.7 x 10308 ------15 или 16 цифр
десятичный ~ ±1.0 x 10-28 до ±7.9 x 1028 --------28 или 29 цифр


для приложений, таких как игры и встроенные системы, где память и производительность имеют решающее значение, float обычно является числовым типом выбора, поскольку он быстрее и вдвое меньше размера double. Целые числа раньше были оружием выбора, но производительность с плавающей запятой обогнала integer в современных процессорах. Десятичные прямо!


типы переменных Decimal, Double и Float отличаются тем, как они хранят значения. Точность-это основное отличие, где float-это тип данных с плавающей запятой одиночной точности (32 бит), double-это тип данных с плавающей запятой двойной точности (64 бит), а decimal-128-битный тип данных с плавающей запятой.

Float-32 бит (7 цифр)

Double-64 бит (15-16 цифр)

Decimal - 128 бит (28-29 значительный цифры)

больше...разница между Decimal, Float и Double


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

Dim fMean as Double = 1.18
Dim fDelta as Double = 0.08
Dim fLimit as Double = 1.1

If fMean - fDelta < fLimit Then
    bLower = True
Else
    bLower = False
End If

вопрос :какое значение содержит переменная воздуходувки?

ответ: на воздуходувке машины бита 32 содержит истинное !!!

Если я заменяю Double На Decimal, bLower содержит FALSE, что является хорошим ответом.

в double проблема в том, что fMean-fDelta = 1.099999999999 это ниже, чем 1.1.

Внимание: я думаю, что та же проблема, безусловно, существует для другого числа, потому что Decimal-это только двойной с более высокой точностью, и точность всегда имеет предел.

фактически, Double, Float и Decimal соответствуют двоичному decimal в COBOL !

жаль ,что другие числовые типы, реализованные в COBOL, не существуют.Сеть. Для тех, кто не знает COBOL, существует в COBOL следующий числовой тип

BINARY or COMP like float or double or decimal
PACKED-DECIMAL or COMP-3 (2 digit in 1 byte)
ZONED-DECIMAL (1 digit in 1 byte) 

простыми словами:

  1. типы переменных Decimal, Double и Float отличаются тем, как они хранят значения.
  2. точность -главное отличие (обратите внимание, что это не единственная разница) где float - тип данных с плавающей запятой одиночной точности (32 бита),двойной тип данных с плавающей запятой двойной точности (64 бит) и decimal-это 128-разрядное тип данных с плавающей запятой.
  3. сводная таблица:

/==========================================================================================
    Type       Bits    Have up to                   Approximate Range 
/==========================================================================================
    float      32      7 digits                     -3.4 × 10 ^ (38)   to +3.4 × 10 ^ (38)
    double     64      15-16 digits                 ±5.0 × 10 ^ (-324) to ±1.7 × 10 ^ (308)
    decimal    128     28-29 significant digits     ±7.9 x 10 ^ (28) or (1 to 10 ^ (28)
/==========================================================================================
Вы можете прочитать больше здесь, Float, двойной и Decimal.

главным образом разница между каждым из этих точность.

float Это 32-bit ряд, double это 64-bit количество и decimal это 128-bit количество.