Разница между decimal, float и double in.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 нельзя использовать для представления многих научных ценности.
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
в случае финансовых приложений или научных расчетов лучше использовать десятичные типы, потому что это дает вам высокий уровень точности и легко избежать ошибок округления
двойной
двойные типы, вероятно, наиболее часто используемые типы данных для реальных значений, кроме обращения с деньгами.
плавание
Он используется в основном в графических библиотеках, потому что очень высокие требования к мощности обработки, также используются ситуации, которые могут терпеть ошибки округления.
- Double и float можно разделить на целое число ноль без исключения как во время компиляции, так и во время выполнения.
- Decimal нельзя разделить на целое число ноль. Компиляция всегда будет неудачной, если вы это сделаете.
целые числа, как уже упоминалось, являются целыми числами. Они не могут что-то запомнить .7, .42, а .007. Если вам нужно хранить числа, которые не являются целыми числами, вам нужен другой тип переменной. Можно использовать тип double или float. Вы устанавливаете эти типы переменных точно так же: вместо использования слова int
вы типа double
или float
. Вот так:
float myFloat;
double myDouble;
(float
сокращенно от "с плавающей запятой" и просто означает число с какой-то точкой на конце.)
разница между ними заключается в размере чисел, которые они могут содержать. Для float
, вы можете иметь до 7 цифр в номере. Для double
s, Вы можете иметь до 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 значительный цифры)
проблема со всеми этими типами заключается в том, что определенная погрешность существует И что эта проблема может возникнуть с небольшими десятичными числами, как в следующем примере
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)
простыми словами:
- типы переменных Decimal, Double и Float отличаются тем, как они хранят значения.
- точность -главное отличие (обратите внимание, что это не единственная разница) где float - тип данных с плавающей запятой одиночной точности (32 бита),двойной тип данных с плавающей запятой двойной точности (64 бит) и decimal-это 128-разрядное тип данных с плавающей запятой.
- сводная таблица:
/==========================================================================================
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
количество.