Разница между десятичной, плавающей и двойной в .NET? - PullRequest
1946 голосов
/ 06 марта 2009

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

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

Ответы [ 16 ]

12 голосов
/ 02 января 2014
  • float: от ± 1,5 x 10 ^ -45 до ± 3,4 x 10 ^ 38 (~ 7 значащих цифр
  • double: ± 5,0 x 10 ^ -324 до ± 1,7 x 10 ^ 308 (15-16 значащих цифр)
  • десятичное число: ± 1,0 x 10 ^ -28 до ± 7,9 x 10 ^ 28 (28-29 значащих цифр)
8 голосов
/ 16 мая 2014

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

7 голосов
/ 30 сентября 2014

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

Число с плавающей запятой - 32 бита (7 цифр)

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

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

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

5 голосов
/ 23 февраля 2017

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

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

Вопрос: Какое значение содержит переменная bLower?

Ответ: На 32-битной машине bLower содержит ИСТИНА !!!

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

В двойном, проблема в том, что fMean-fDelta = 1,09999999999, что ниже, чем 1,1.

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

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

К сожалению, другие числовые типы, реализованные в COBOL, не существуют в .Net. Для тех, кто не знает 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) 
4 голосов
/ 10 февраля 2018

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

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

<code>/==========================================================================================
    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 , Double и Decimal .
3 голосов
/ 21 декабря 2014

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

float - это число 32-bit, double - это число 64-bit, а decimal - это число 128-bit.

...