.NET에서 decimal, float 및 double의 차이점은 무엇입니까?


답변:


2265

float하고 double있습니다 부동 이진 소수점 형식을 . 즉, 다음과 같은 숫자를 나타냅니다.

10001.10010110011

이진수와 이진수의 위치는 모두 값 내에 인코딩됩니다.

decimalA는 부동 소수점 포인트 유형 . 즉, 다음과 같은 숫자를 나타냅니다.

12345.65789

다시 말하지만, 소수점 의 숫자와 위치 는 모두 값 내에 인코딩됩니다 decimal. 이것이 고정 소수점 유형 대신 부동 소수점 유형을 만드는 것입니다.

주의해야 할 중요한 점은 인간은 정수가 아닌 정수를 10 진수 형식으로 나타내는 데 사용되며 10 진수로 정확한 결과를 기대한다는 것입니다. 모든 소수를 이진 부동 소수점 (예 : 0.1)으로 정확하게 표현할 수있는 것은 아닙니다. 따라서 이진 부동 소수점 값을 사용하면 실제로는 대략 0.1이됩니다. 부동 소수점을 사용할 때도 근사값을 얻을 수 있습니다. 예를 들어 1을 3으로 나눈 결과는 정확하게 표현할 수 없습니다.

언제 사용 하는가에 관해서 :

  • "자연스럽게 정확한 소수"인 값의 경우을 사용하는 것이 좋습니다 decimal. 이것은 일반적으로 인간이 발명 한 모든 개념에 적합합니다. 재무 가치가 가장 분명한 예이지만 다른 것도 있습니다. 예를 들어 다이버 나 아이스 스케이터에게 주어진 점수를 고려하십시오.

  • 정말 측정 할 수없는 성격의 많은 유물입니다 값에 대해서는 정확히 어쨌든, float/ double더 적합합니다. 예를 들어 과학 데이터는 일반적으로이 형식으로 표시됩니다. 여기서 원래 값은 "소수 적으로 정확"하지 않으므로 예상 결과가 "소수 정확도"를 유지하는 것은 중요하지 않습니다. 부동 이진 소수점 유형은 소수보다 작업 속도가 훨씬 빠릅니다.


58
float/ double일반적으로 숫자를 나타내는 것으로 나타내지 않습니다 101.101110. 일반적으로 1101010 * 2^(01010010)지수 와 같은 것으로 나타납니다
Mingwei Samuel

79
@Hazzard : 이것이 답변의 "이진 지점의 위치"부분의 의미입니다.
Jon Skeet

112
이미 언급되지 않았 float으며 C # 별칭 키워드이며 .Net 유형 이 아닌 것이 놀랍습니다 . 그건 System.Single.. singledouble이진 소수점 형식을 떠 있습니다.
Brett Caswell

54
@ BKSpurgeon : 글쎄, 모든 것이 이진 유형 이라고 말할 수있는 것과 같은 방식으로 , 그 시점에서 그것은 상당히 쓸모없는 정의가됩니다. 10 진수는 10 진수 유형으로, 정수로 표시되는 숫자와 스케일로 표시되며 결과는 중요하고 * 10 ^ scale이고 float와 double은 significand * 2 ^ scale입니다. 소수점으로 쓴 숫자를 가져 와서 소수점을 유의미하고 스케일을 계산하기 위해 정수가있는 오른쪽으로 충분히 이동하십시오. float / double의 경우 이진수로 작성된 숫자로 시작합니다.
Jon Skeet

21
또 다른 차이점 : float 32 비트; 이중 64 비트; 십진수 128 비트.
David

1072

주요 차이점은 정밀성입니다.

부동 -7 자리 (32 비트)

더블 -15-16 자리 (64 비트)

10 진수 -28-29 유효 숫자 (128 비트)

십진법은 정밀도가 훨씬 높으며 일반적으로 높은 정확도를 요구하는 금융 응용 프로그램에서 사용됩니다. 십진법은 더블 / 플로트보다 훨씬 느립니다 (일부 테스트에서는 최대 20 배).

십진법과 실수 / 더블은 캐스트없이 비교할 수 없지만 부유물과 복식은 비교할 수 없습니다. 10 진수는 인코딩 또는 후행 0도 허용합니다.

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

65
@Thecrocodilehunter : 죄송합니다. 10 진수는 10 진수 표기법으로 표현할 수있는 모든 숫자를 나타낼 수 있지만 예를 들어 1/3은 아닙니다. 1.0m / 3.0m은 0.33333333으로 평가되지만 끝에는 3이 유한합니다. 3을 곱하면 정확한 1.0을 반환하지 않습니다.
Erik P.

50
@ Thecrocodilehunter : 나는 당신이 정확성과 정밀도를 혼란스럽게 생각합니다. 이런 맥락에서 그것들은 다릅니다. 정밀도는 숫자를 나타내는 데 사용할 수있는 자릿수입니다. 정밀도가 높을수록 반올림 할 필요가 줄어 듭니다. 무한 정도의 데이터 타입은 없습니다.
Igby Largeman

13
@Thecrocodilehunter : 당신은 측정되고있는 가치가 정확히 맞다고 가정합니다 0.1– 그것은 실제 세계에서는 거의 그렇지 않습니다! 모든 유한의 저장 형식은 비트 패턴의 한정된 수의 가능한 값의 수를 무한 conflate 것이다. 예를 들어, floatconflate 것 0.10.1 + 1e-8동시에, decimalconflate 것 0.1하고 0.1 + 1e-29. 물론, 주어진 범위 내에서 , 특정 값은 정확도 손실이없는 모든 형식으로 표현 될 수 있습니다 (예 : 정확도 손실이없는 상태에서 float최대 1.6e7의 정수를 저장할 수 있음). 그러나 여전히 무한 정확도 는 아닙니다 .
Daniel Pryden

27
@ Thecrocodilehunter : 당신은 내 요점을 놓쳤다. 특별한 가치0.1아닙니다 ! 수있는 유일한 방법 0.1보다 "더 나은" 0.10000001때문입니다 인간 베이스 (10) 그리고 심지어와 같은 float당신이 두 값을 초기화 할 경우 값이 0.1같은 방식으로, 그들은 모두 같은 값이됩니다 . 그것은 단지 그 값이 정확 하지 않다는 것입니다. 0.1그것은 정확히로 표현 될 수 있는 가장 가까운 값0.1float 입니다. 물론, 이진 수레가 (1.0 / 10) * 10 != 1.0있지만 십진 수레 수가 (1.0 / 3) * 3 != 1.0있습니다. 어느 쪽완벽 하지는 않습니다 .
Daniel Pryden

16
@ Thecrocodilehunter : 당신은 여전히 ​​이해하지 못합니다. 나는 이것을 더 분명하게 말하는 방법을 모른다 : C에서, 당신이 double a = 0.1; double b = 0.1;그렇다면 a == b 사실이 될 것이다 . 그것은 단지의 ab모두 정확히 동일하지 0.1. C #에서, 당신이 할 경우 decimal a = 1.0m / 3.0m; decimal b = 1.0m / 3.0m;다음 a == b도 마찬가지 일 것이다. 그러나이 경우, 어느 쪽a도는 b것입니다 정확히 동일 1/3- 그들은 것 모두 동일 0.3333.... 에서 경우, 일부 정확도는 표현으로 인해 손실됩니다. 당신은 완고하게 decimal"무한"정밀도 를 가지고 있다고 말하는데 , 그것은 거짓 입니다.
Daniel Pryden

84

Decimal 구조는 정확성을 요구하는 재무 계산에 엄격하게 맞춰져 있으며, 이는 상대적으로 반올림을 허용하지 않습니다. 그러나 십진법은 몇 가지 이유로 과학적 응용에는 적합하지 않습니다.

  • 많은 과학적 계산에서 측정되는 물리적 문제 나 아티팩트의 실제 한계로 인해 특정 정밀도 손실이 허용됩니다. 금융에서 정밀도 손실은 허용되지 않습니다.
  • 십진법은 대부분 부동 소수점 연산이 부동 소수 점수보다 두 배 느립니다. 대부분 부동 소수점 연산은 2 진법으로 이루어 지지만 10 진수는 10 진법으로 이루어집니다 (즉, 부동 소수 점수는 MMX / SSE와 같은 FPU 하드웨어에 의해 처리됩니다) , 소수는 소프트웨어에서 계산됩니다).
  • 십진수는 더 많은 자릿수를 지원한다는 사실에도 불구하고 두 배보다 허용 할 수 없을 정도로 작은 값 범위를 갖습니다. 따라서 Decimal은 많은 과학적 가치를 나타내는 데 사용될 수 없습니다.

5
재무 계산을 수행하는 경우 자신의 데이터 유형을 롤링하거나 정확한 요구에 맞는 우수한 라이브러리를 찾아야합니다. 재무 환경의 정확도는 (인간) 표준기구에 의해 정의되며 계산 방법에 대한 매우 구체적인 현지화 (시간 및 지리) 규칙이 있습니다. 올바른 반올림과 같은 것은 .Net의 간단한 숫자 데이터 유형으로 캡처되지 않습니다. 계산 능력은 퍼즐의 아주 작은 부분 일뿐입니다.
James Moore

76
+---------+----------------+---------+----------+---------------------------------------------+
| C#      | .Net Framework | Signed? | Bytes    | Possible Values                             |
| Type    | (System) type  |         | Occupied |                                             |
+---------+----------------+---------+----------+---------------------------------------------+
| sbyte   | System.Sbyte   | Yes     | 1        | -128 to 127                                 |
| short   | System.Int16   | Yes     | 2        | -32768 to 32767                             |
| int     | System.Int32   | Yes     | 4        | -2147483648 to 2147483647                   |
| long    | System.Int64   | Yes     | 8        | -9223372036854775808 to 9223372036854775807 |
| byte    | System.Byte    | No      | 1        | 0 to 255                                    |
| ushort  | System.Uint16  | No      | 2        | 0 to 65535                                  |
| uint    | System.UInt32  | No      | 4        | 0 to 4294967295                             |
| ulong   | System.Uint64  | No      | 8        | 0 to 18446744073709551615                   |
| float   | System.Single  | Yes     | 4        | Approximately ±1.5 x 10-45 to ±3.4 x 1038   |
|         |                |         |          |  with 7 significant figures                 |
| double  | System.Double  | Yes     | 8        | Approximately ±5.0 x 10-324 to ±1.7 x 10308 |
|         |                |         |          |  with 15 or 16 significant figures          |
| decimal | System.Decimal | Yes     | 12       | Approximately ±1.0 x 10-28 to ±7.9 x 1028   |
|         |                |         |          |  with 28 or 29 significant figures          |
| char    | System.Char    | N/A     | 2        | Any Unicode character (16 bit)              |
| bool    | System.Boolean | N/A     | 1 / 2    | true or false                               |
+---------+----------------+---------+----------+---------------------------------------------+

자세한 내용은 여기를 참조하십시오 .


5
10 진수 유형에 사용되는 기준 인 가장 큰 차이는 생략했습니다 (10 진법은 10 진법으로 저장되고 나열된 다른 모든 숫자 유형은 2 진법입니다).
BrainSlugs83

1
위의 이미지 또는 소스 포럼 게시물에 Single 및 Double의 값 범위가 올바르게 표시되지 않습니다. 여기서 텍스트를 쉽게 위 첨자로 작성할 수 없으므로 캐럿 문자를 사용하십시오. Single은 10 ^ -45 및 10 ^ 38이어야하고 Double은 10 ^ -324 및 10 ^ 308이어야합니다. 또한 MSDN에는 -3.4x10 ^ 38 ~ + 3.4x10 ^ 38 범위의 부동 소수점이 있습니다. 링크 변경시 MSDN에서 System.Single 및 System.Double을 검색하십시오. 단일 : msdn.microsoft.com/en-us/library/b1e65aza.aspx Double : msdn.microsoft.com/en-us/library/678hzkk9.aspx
deegee

2
진수 128 비트 ... 수단이없는 16 바이트 12 차지
user1477332

51

다른 답변과 의견에 이미 답변 된 좋은 (그리고 일부 나쁜) 정보를 반복하지는 않지만 다음 질문에 대한 팁으로 답변 해 드리겠습니다.

누군가이 중 하나를 언제 사용합니까?

계산 된 값에 10 진수 사용

측정 값에 float / double 사용

몇 가지 예 :

  • 돈 (돈을 세거나 돈을 측정합니까?)

  • 거리 (거리를 세거나 거리를 측정합니까? *)

  • 점수 (점수를 세거나 점수를 측정합니까?)

우리는 항상 돈을 세고 측정해서는 안됩니다. 우리는 보통 거리를 측정합니다. 우리는 종종 점수를 계산합니다.

* 경우에 따라 공칭 거리 라고 부르는 것은 실제로 거리를 계산하는 것이 좋습니다. 예를 들어, 도시까지의 거리를 나타내는 국가 표시를 처리하고있을 수 있으며 해당 거리는 10 진수 (xxx.xkm)를 초과하지 않습니다.


1
저는이 답변이 정말 마음에 듭니다. 특히 "돈을 세거나 측정합니까?" 그러나 돈 외에는 단순히 정수가 아닌 "계산 된"것은 생각할 수 없습니다. double에 유효 숫자 가 너무 적기 때문에 단순히 소수를 사용하는 일부 응용 프로그램을 보았습니다 . 다시 말해, C #에는 4 중 유형 en.wikipedia.org/wiki/Quadruple-precision_floating-point_format
John Henckel

48

float 7 자리 정밀도

double 정밀도는 약 15 자리입니다.

decimal 정밀도는 약 28 자리입니다

더 나은 정확도가 필요하면 float 대신 double을 사용하십시오. 최신 CPU에서는 두 데이터 유형이 거의 동일한 성능을 갖습니다. float를 사용하는 유일한 이점은 공간을 덜 차지한다는 것입니다. 실제로 많은 것을 가지고있는 경우에만 중요합니다.

나는 이것이 재미 있다는 것을 알았다. 부동 소수점 산술에 대해 모든 컴퓨터 과학자가 알아야 할 사항


1
@RogerLipscombe : double32 비트보다 큰 정수 유형을 사용할 수 double없었고 53 비트 정수 유형 인 것처럼 사용 된 경우 (예 : 보유 )의 경우 회계 응용 프로그램에서 적절 하다고 생각합니다. 전체 동전, 또는 100 분의 1 센트의 정수). 오늘날 그러한 것들에는 많이 사용되지는 않지만 많은 언어는 64 비트 (또는 경우에 따라 32 비트!) 정수 수학을 얻기 전에 배정도 부동 소수점 값을 사용할 수 있습니다.
supercat

1
귀하의 답변은 정밀도가 이러한 데이터 유형 간의 유일한 차이점임을 암시합니다. 이진 부동 소수점 산술은 일반적으로 하드웨어 FPU 에서 구현 되므로 성능이 크게 다릅니다. 이는 일부 응용 프로그램에는 중요하지 않지만 다른 응용 프로그램에는 중요합니다.
세일

6
@supercat double은 회계 응용 프로그램에 적합 하지 않습니다 . Double은 소수점 이하의 값만 근사 할 수 있기 때문에 (자체 정밀도 범위 내에서도). double은 기본 2 (이진) 중심 형식으로 값을 저장하기 때문입니다.
BrainSlugs83

2
@ BrainSlugs83 : 정수 이외의 수량 을 보유하기 위해 부동 소수점 유형을 사용하는 것은 적절하지 않지만, 정수 유형이 나타낼 수있는 것보다 더 큰 정수 값을 정확하게 나타낼 수있는 부동 소수점 유형을 가진 언어가 역사적으로 매우 일반적이었습니다. . 아마도 가장 극단적 인 예는 정수 유형 만 -32768에서 +32767로 제한되었지만 RealIIRC는 단위 정밀도로 최대 1.8E + 19까지의 값을 나타낼 수 있는 Turbo-87 일 것입니다. 회계 응용 프로그램을 사용하는 것보다 훨씬 많은 Real동전을 표현하는 데 훨씬 더 안전하다고 생각합니다 .
supercat

1
... 여러 개의 16 비트 값을 사용하여 다중 정밀도 수학을 수행하려고합니다. 대부분의 다른 언어의 경우 그 차이는 그다지 크지 않았지만 오랫동안 4E9를 넘어서는 정수 유형을 갖지 않고 double단위 정확도가 9E15까지 인 유형을 갖는 언어가 매우 일반적 이었습니다. 사용 가능한 가장 큰 정수 유형보다 큰 정수를 저장 해야하는 경우 double, 특히 프로세서가 16x16-> 32를 수행하는 명령을 가지고 있지만 다중 정밀도 수학을 퍼지하는 것보다 간단하고 효율적입니다. ..
supercat

36

아무도 언급하지 않았습니다

기본 설정에서 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;

1
float.MaxValue+1 == float.MaxValue마찬가지로 decimal.MaxValue+0.1D == decimal.MaxValue. 아마도 당신은 같은 것을 의미 float.MaxValue*2했습니까?
supercat

@supercar 그러나 decimal.MaxValue + 1 == decimal.MaxValue
GorkemHalulu

@supercar decimal.MaxValue + 0.1m == decimal.MaxValue ok
GorkemHalulu

1
System.Decimal이 전체 단위를 구별 할 수 없게 직전에 예외가 발생하지만, 응용 프로그램은 너무 늦을 수 있습니다 예를 들어, 달러와 센트를 처리하도록되어있는 경우.
supercat

28
  1. 컴파일 및 런타임 모두에서 예외없이 Double 및 float을 정수 0으로 나눌 수 있습니다.
  2. 10 진수는 정수 0으로 나눌 수 없습니다. 그렇게하면 컴파일이 항상 실패합니다.

6
그들은 확실히 할 수 있습니다! 또한 Infinity, Negative Infinity 및 NaN (숫자가 아님)과 같은 몇 가지 "마법"값이있어서 경사를 계산하는 동안 수직선을 감지하는 데 매우 유용합니다. 또한 플로팅 호출간에 결정해야하는 경우 .TryParse, double.TryParse 및 decimal.TryParse (예 : 문자열이 숫자인지 여부를 감지하기 위해)는 "Infinity", "-Infinity"및 "NaN"을 올바르게 구문 분석하므로 double 또는 float을 사용하는 것이 좋습니다. , 소수는 그렇지 않습니다.
BrainSlugs83

리터럴 decimal을 0 으로 나누려고 하면 (CS0020) 컴파일 이 실패 하고 정수 리터럴의 경우에도 마찬가지입니다. 그러나 런타임 10 진수 값을 0으로 나누면 컴파일 오류가 아닌 예외가 발생합니다.
Drew Noakes

@ BrainSlugs83 그러나 컨텍스트에 따라 "Infinity"또는 "NaN"을 구문 분석하지 않을 수 있습니다. 개발자가 충분히 엄격하지 않은 경우 사용자 입력을 잘 활용하는 것처럼 보입니다.
겨울 1

28

언급 한 바와 같이 정수는 정수입니다. .7, .42 및 .007과 같이 포인트를 저장할 수 없습니다. 정수가 아닌 숫자를 저장해야하는 경우 다른 유형의 변수가 필요합니다. double 형이나 float 형을 사용할 수 있습니다. 이러한 유형의 변수는 정확히 같은 방식으로 설정합니다. 단어를 사용하는 대신 또는 int을 입력 합니다. 이처럼 :doublefloat

float myFloat;
double myDouble;

( float"부동 소수점"의 줄임말이며 끝에 점이있는 숫자를 의미합니다.)

둘의 차이점은 보유 할 수있는 숫자의 크기입니다. 의 경우 float최대 7 자리 숫자를 사용할 수 있습니다. 의 경우 double최대 16 자리를 가질 수 있습니다. 보다 정확한 공식 크기는 다음과 같습니다.

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

float32 비트 숫자이며 double64 비트 숫자입니다.

코드를 보려면 새 버튼을 두 번 클릭하십시오. 버튼 코드에 다음 세 줄을 추가하십시오.

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

프로그램을 중단하고 코딩 창으로 돌아갑니다. 이 줄을 바꾸십시오 :

myDouble = 0.007;
myDouble = 12345678.1234567;

프로그램을 실행하고 이중 버튼을 클릭하십시오. 메시지 상자에 번호가 올바르게 표시됩니다. 그러나 끝에 다른 숫자를 추가하면 C #이 다시 반올림 또는 내림됩니다. 도덕은 정확성을 원한다면 반올림에주의하십시오!


2
언급 한 "무언가"는 일반적으로 숫자의 "소수 부분"이라고합니다. "부동 점"은 "끝에 무언가가있는 숫자"를 의미하지 않습니다. 그러나 "부동 소수점"은 "고정 소수점"숫자 (소수 값도 저장할 수 있음)와 반대로 숫자 유형을 구별합니다. 차이점은 정밀도가 고정인지 부동인지입니다. -부동 소수점 숫자는 정밀도 비용으로 훨씬 더 큰 동적 값 범위 (최소 및 최대)를 제공하는 반면 고정 소수점 숫자는 범위 비용에서 일정한 정밀도를 제공합니다.
BrainSlugs83

16
  • float : ± 1.5 x 10 ^ -45 ~ ± 3.4 x 10 ^ 38 (~ 7 유효 숫자
  • 이중 : ± 5.0 x 10 ^ -324 ~ ± 1.7 x 10 ^ 308 (15-16 유효 숫자)
  • 10 진수 : ± 1.0 x 10 ^ -28 ~ ± 7.9 x 10 ^ 28 (28-29 유효 숫자)

9
차이점은 단순한 정밀도 이상의 것입니다. - decimal실제로 2 진수 형식과는 반대로 10 진수 형식으로 저장되므로 두 숫자 시스템 간의 변환으로 인해 숫자가 손실되거나 반올림되지 않습니다. 또한 decimalNaN, -0, ∞ 또는 -∞과 같은 특수 값 개념이 없습니다.
BrainSlugs83

13

오늘 우리는 a decimal보다 정밀도가 떨어지는 것에 대해 불쾌한 작은 버그가 있었기 때문에 이것은 나에게 흥미로운 스레드였습니다 float.

C # 코드에서는 Excel 스프레드 시트에서 숫자 값을 읽고이를로 변환 decimal한 다음이 decimal를 서비스로 다시 전송 하여 SQL Server 데이터베이스에 저장 합니다.

Microsoft.Office.Interop.Excel.Range cell = 
object cellValue = cell.Value2;
if (cellValue != null)
{
    decimal value = 0;
    Decimal.TryParse(cellValue.ToString(), out value);
}

이제 거의 모든 Excel 값에 대해 이것은 아름답게 작동했습니다. 그러나 매우 작은 Excel 값의 decimal.TryParse경우 값을 완전히 잃어 버렸습니다. 그러한 예 중 하나는

  • cellValue = 0.00006317592

  • Decimal.TryParse (cellValue.ToString (), 출력 값); // 0 을 반환

기괴하게도 해결책은 Excel 값을 double첫 번째 값으로 변환 한 다음 decimal:

Microsoft.Office.Interop.Excel.Range cell = 
object cellValue = cell.Value2;
if (cellValue != null)
{
    double valueDouble = 0;
    double.TryParse(cellValue.ToString(), out valueDouble);
    decimal value = (decimal) valueDouble;
    
}

double보다 정밀도가 떨어지지 만 decimal실제로는 적은 수를 인식 할 수 있습니다. 어떤 이유로, double.TryParse실제로 작은 숫자를 검색 할 수 있었지만 decimal.TryParse0으로 설정했습니다.

이상한. 매우 이상합니다.


3
호기심에서 cellValue.ToString ()의 원시 값은 무엇입니까? Decimal.TryParse ( "0.00006317592, out val) 작동하는 것 같습니다 ...
micahtan

11
-1 오해하지 마십시오. 사실이라면 매우 흥미롭지 만 이것은 별도의 질문이므로 확실히이 질문에 대한 답은 아닙니다.
weston

2
Excel 셀이 double을 반환하고 ToString () 값이 "6.31759E-05"이므로 decimal.Parse ()가 표기법을 좋아하지 않았을 수 있습니다. Decimal.TryParse ()의 반환 값을 확인하면 false 일 것입니다.
SergioL

2
@weston Answers는 종종 놓친 뉘앙스를 채워 다른 답변을 보완합니다. 이 답변은 구문 분석의 차이점을 강조합니다. 질문에 대한 답변입니다!
Robino

1
어 .. decimal.Parse("0.00006317592")작동합니다. 다른 일이 있습니다. -아마도 과학적 표기법?
BrainSlugs83

8

메모리와 성능이 모두 중요한 게임 및 임베디드 시스템과 같은 응용 프로그램의 경우 float는 일반적으로 두 배의 절반 크기보다 빠르기 때문에 숫자 선택 유형입니다. 정수는 선택의 무기 였지만 부동 소수점 성능은 현대 프로세서에서 정수를 능가했습니다. 십진법이 바로입니다!


거의 모든 현대 시스템, 심지어 휴대폰까지도 이중을 지원하는 하드웨어가 있습니다. 게임에 물리가 단순하다면 double과 float의 차이가 큰 것을 알 수 있습니다. (예를 들어, 간단한 소행성 클론에서 속도 / 마찰을 계산하면 배가 두 배로 가속이 플로트보다 훨씬 더 유동적으로 흐릅니다.-중요하지는 않지만 완전히 작동합니다.)
BrainSlugs83

더블은 플로트 크기의 두 배이기도하므로 두 배의 데이터를 씹어야하므로 캐시 성능이 저하됩니다. 항상 그렇듯이 측정하고 이에 따라 진행하십시오.
yoyo

6

Decimal, Double 및 Float 변수 유형은 값을 저장하는 방식이 다릅니다. float는 단 정밀도 (32 비트) 부동 소수점 데이터 유형이고 double은 배정 밀도 (64 비트) 부동 소수점 데이터 유형이고 10 진수는 128 비트 부동 소수점 데이터 유형 인 경우 정밀도는 주요 차이점입니다.

부동-32 비트 (7 자리)

이중-64 비트 (15-16 자리)

10 진수-128 비트 (28-29 유효 숫자)

Decimal, Float 및 Double의 차이점 에 대한 자세한 내용


5

이러한 모든 유형의 문제점은 특정 부정확성이 존재하며이 예제는 다음 예제와 같이 작은 소수로 발생할 수 있다는 것입니다

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는 TRUE를 포함합니다 !!!

Double을 Decimal로 바꾸면 bLower에 FALSE가 포함되어 있습니다.

이중으로, 문제는 fMean-fDelta = 1.09999999999이며 1.1보다 낮습니다.

주의 : Decimal은 정밀도가 두 배이고 정밀도는 항상 한계가 있기 때문에 다른 숫자에도 동일한 문제가 존재할 수 있다고 생각합니다.

실제로 Double, Float 및 Decimal은 COBOL의 BINARY 10 진수에 해당합니다!

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

간단히 말해서 :

  1. Decimal, Double 및 Float 변수 유형은 값을 저장하는 방식이 다릅니다.
  2. float 는 단 정밀도 (32 비트) 부동 소수점 데이터 유형이고, double 은 배정도 (64 비트) 부동 소수점 데이터 유형이고 10 진수 는 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 , DoubleDecimal을 참조하십시오 .


이 답변은 기존 답변에서 아직 다루지 않은 내용을 추가합니까? BTW, "소수"줄의 "또는"이 잘못되었습니다. 복사하는 웹 페이지의 슬래시는 대체가 아니라 구분을 나타냅니다.
Mark Dickinson

1
그리고 나는 정밀도가 주요한 차이점이라는 것을 강력히 논박합니다. 주요 차이점은 십진 부동 소수점 대 이진 부동 소수점입니다. 그 차이를 만드는 것입니다 Decimal금융 애플리케이션에 적합하며 사이를 결정할 때 사용하는 주요 기준이다 DecimalDouble. Double예를 들어 정밀성이 과학 응용 분야에 충분하지 않은 경우는 드물며 제한적인 범위 때문에 과학 응용 분야 에는 적합하지 않은Decimal 경우가 많습니다 .
Mark Dickinson

2

이들 각각의 주요 차이점은 정밀도입니다.

floatA는 32-bit번호, doubleA는 64-bit번호와 decimalA는 128-bit번호입니다.


0
  • 10 진수 128 비트 (28-29 유효 숫자) 재무 응용 프로그램의 경우 높은 수준의 정확도를 제공하고 반올림 오류를 피하기 때문에 10 진수 형식을 사용하는 것이 좋습니다. 정밀도가 필요한 경우 정수가 아닌 수학에는 10 진수를 사용하십시오 (예 : 돈과 통화)

  • 이중 64 비트 (15-16 자리) 이중 유형은 비용 처리를 제외하고 실제 값에 가장 일반적으로 사용되는 데이터 유형입니다. 가장 정확한 답이 필요하지 않은 정수가 아닌 수학에는 double을 사용하십시오.

  • Float 32 비트 (7 자리) 주로 처리 능력에 대한 요구가 높고 반올림 오류를 견딜 수있는 상황이 발생하기 때문에 주로 그래픽 라이브러리에서 사용됩니다.

Decimals보다 훨씬 느립니다 double/float.

DecimalsFloats/Doubles캐스트없이 비교할 수없는 반면 FloatsDoubles 캔.

Decimals 인코딩 또는 후행 0도 허용합니다.


-1

.Net에서 십진수, 부동 및 이중을 정의하려면 (C #)

다음과 같이 값을 언급해야합니다.

Decimal dec = 12M/6;
Double dbl = 11D/6;
float fl = 15F/6;

결과를 확인하십시오.

그리고 각각에 의해 점유 된 바이트는

Float - 4
Double - 8
Decimal - 12
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.