.NET에서 decimal
, float
및 double
의 차이점은 무엇입니까?
누군가 언제 이것들 중 하나를 사용할까요?
질문자 :Tom
.NET에서 decimal
, float
및 double
의 차이점은 무엇입니까?
누군가 언제 이것들 중 하나를 사용할까요?
float
및 double
은 부동 이진 소수점 유형 입니다. 즉, 다음과 같은 숫자를 나타냅니다.
10001.10010110011
이진수와 이진수 포인트의 위치는 모두 값 내에서 인코딩됩니다.
decimal
은 부동 소수점 유형 입니다. 즉, 다음과 같은 숫자를 나타냅니다.
12345.65789
다시 말하지만, 소수점 의 숫자와 위치는 모두 값 내에서 인코딩됩니다. 이것이 decimal
고정 소수점 유형 대신 부동 소수점 유형으로 만드는 이유입니다.
주목해야 할 중요한 점은 인간은 정수가 아닌 것을 10진수 형식으로 표현하는 데 익숙하고 10진수 표현으로 정확한 결과를 기대한다는 것입니다. 모든 십진수가 이진 부동 소수점(예: 0.1)으로 정확하게 표현할 수 있는 것은 아니므로 이진 부동 소수점 값을 사용하면 실제로 0.1에 대한 근사값을 얻게 됩니다. 부동 소수점을 사용할 때도 근사값을 얻을 수 있습니다. 예를 들어 1을 3으로 나눈 결과는 정확하게 나타낼 수 없습니다.
다음과 같은 경우에 무엇을 사용해야 합니까?
"자연스럽게 정확한 소수"인 값의 경우 decimal
을 사용하는 것이 좋습니다. 이것은 일반적으로 인간이 발명한 모든 개념에 적합합니다. 재정적 가치가 가장 분명한 예이지만 다른 예도 있습니다. 예를 들어, 다이버나 아이스 스케이팅 선수에게 주어진 점수를 고려하십시오.
어쨌든 정확히 측정할 수 없는 자연의 인공물인 값의 float
/ double
이 더 적합합니다. 예를 들어 과학 데이터는 일반적으로 이 형식으로 표시됩니다. 여기서 원래 값은 처음부터 "소수점 정확도"가 아니므로 예상 결과가 "소수점 정확도"를 유지하는 것이 중요하지 않습니다. 부동 이진 소수점 유형은 소수보다 작업 속도가 훨씬 빠릅니다.
정밀도가 주요 차이점입니다.
부동 - 7자리(32비트)
더블 -15-16자리(64비트)
10진수 -28-29 유효 자릿수(128비트)
소수는 훨씬 더 높은 정밀도를 가지며 일반적으로 높은 정확도를 요구하는 금융 응용 프로그램에서 사용됩니다. 소수는 double/float보다 훨씬 느립니다(일부 테스트에서는 최대 20배).
Decimal과 Floats/Doubles는 캐스트 없이 비교할 수 없지만 Floats와 Doubles는 할 수 있습니다. 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
+---------+----------------+---------+----------+---------------------------------------------------------+ | C# | .Net Framework | Signed? | Bytes | Possible Values | | Type | (System) type | | Occupied | | +---------+----------------+---------+----------+---------------------------------------------------------+ | sbyte | System.Sbyte | Yes | 1 | -128 to 127 | | short | System.Int16 | Yes | 2 | -32,768 to 32,767 | | int | System.Int32 | Yes | 4 | -2,147,483,648 to 2,147,483,647 | | long | System.Int64 | Yes | 8 | -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 | | byte | System.Byte | No | 1 | 0 to 255 | | ushort | System.Uint16 | No | 2 | 0 to 65,535 | | uint | System.UInt32 | No | 4 | 0 to 4,294,967,295 | | ulong | System.Uint64 | No | 8 | 0 to 18,446,744,073,709,551,615 | | float | System.Single | Yes | 4 | Approximately ±1.5e-45 to ±3.4e38 | | | | | | with ~6-9 significant figures | | double | System.Double | Yes | 8 | Approximately ±5.0e-324 to ±1.7e308 | | | | | | with ~15-17 significant figures | | decimal | System.Decimal | Yes | 16 | Approximately ±1.0e-28 to ±7.9e28 | | | | | | with 28-29 significant figures | | char | System.Char | N/A | 2 | Any Unicode character (16 bit) | | bool | System.Boolean | N/A | 1 / 2 | true or false | +---------+----------------+---------+----------+---------------------------------------------------------+
십진법 구조는 반올림을 비교적 허용하지 않는 정확도를 요구하는 재무 계산에 엄격하게 맞춰져 있습니다. 그러나 다음과 같은 몇 가지 이유로 소수는 과학적 응용에 적합하지 않습니다.
다른 답변과 의견에 이미 답변되어 있는 좋은(그리고 나쁜) 정보를 많이 반복하지는 않겠지만, 귀하의 후속 질문에 팁으로 답변해 드리겠습니다.
누군가 언제 이것들 중 하나를 사용할까요?
계산된 값에 10진수 사용
측정 값에 float/double 사용
몇 가지 예:
돈 (우리는 돈을 세거나 돈을 측정합니까?)
거리(거리를 계산합니까 아니면 거리를 측정합니까? *)
점수(점수를 계산합니까 아니면 점수를 측정합니까?)
우리는 항상 돈을 세고 측정해서는 안 됩니다. 우리는 일반적으로 거리를 측정합니다. 우리는 종종 점수를 계산합니다.
* 어떤 경우에는 명목 거리 라고 하는 것이 실제로 거리를 '계산'하고 싶을 수도 있습니다. 예를 들어, 우리는 도시까지의 거리를 표시하는 국가 기호를 처리하고 있으며 이러한 거리에는 십진수(xxx.x km)가 한 개를 넘지 않는다는 것을 알고 있습니다.
float
7자리 정밀도
double
의 정밀도는 약 15자리입니다.
decimal
는 약 28자리의 정밀도를 갖습니다.
더 나은 정확도가 필요하면 float 대신 double을 사용하십시오. 최신 CPU에서 두 데이터 유형은 거의 동일한 성능을 갖습니다. float를 사용하는 유일한 이점은 공간을 덜 차지한다는 것입니다. 실제로 많이 가지고 있는 경우에만 중요합니다.
나는 이것이 흥미롭다는 것을 알았다. 모든 컴퓨터 과학자가 부동 소수점 산술에 대해 알아야 할 사항
아무도 그것을 언급하지 않았다
기본 설정에서 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;
앞서 언급한 것처럼 정수는 정수입니다. .7, .42 및 .007과 같은 점을 저장할 수 없습니다. 정수가 아닌 숫자를 저장해야 하는 경우 다른 유형의 변수가 필요합니다. Double 유형 또는 float 유형을 사용할 수 있습니다. 이러한 유형의 변수는 정확히 같은 방식으로 설정합니다. int
double
또는 float
를 입력합니다. 이와 같이:
float myFloat; double myDouble;
( float
는 "floating point" 의 줄임말로 끝에 점이 있는 숫자를 의미합니다.)
둘의 차이는 그들이 담을 수 있는 숫자의 크기에 있습니다. 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, Double 및 Float 변수 유형은 값을 저장하는 방식이 다릅니다. 정밀도는 float가 단정밀도(32비트) 부동 소수점 데이터 유형이고, double은 배정밀도(64비트) 부동 소수점 데이터 유형이고, decimal은 128비트 부동 소수점 데이터 유형인 주요 차이점입니다.
부동 소수점 - 32비트(7자리)
더블 - 64비트(15-16자리)
10진수 - 128비트(28-29 유효 자릿수)
추가 정보... Decimal, Float 및 Double의 차이점
이것은 나에게 흥미로운 스레드였습니다. 오늘 우리는 float
보다 정밀도가 낮은 decimal
에 관한 불쾌한 작은 버그가 있었습니다.
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
사용하면 값이 완전히 손실되었습니다. 그러한 예는
셀 값 = 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.TryParse
는 0으로 설정합니다.
이상한. 매우 이상합니다.
메모리와 성능이 모두 중요한 게임 및 임베디드 시스템과 같은 응용 프로그램의 경우 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
질문: bLower 변수에는 어떤 값이 포함되어 있습니까?
답변: 32비트 시스템에서 bLower는 TRUE를 포함합니다!!!
Double을 Decimal로 바꾸면 bLower에는 좋은 대답인 FALSE가 포함됩니다.
이중에서 문제는 fMean-fDelta = 1.09999999999로 1.1보다 낮습니다.
주의: Decimal은 정밀도가 더 높은 double형에 불과하고 정밀도에는 항상 한계가 있기 때문에 다른 숫자에 대해서도 동일한 문제가 분명히 존재할 수 있다고 생각합니다.
실제로 Double, Float 및 Decimal은 COBOL의 BINARY 십진수에 해당합니다!
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)
간단히 말해서:
/========================================================================================== 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) /==========================================================================================
십진법 128비트(28-29 유효 자릿수) 금융 응용 프로그램의 경우 정확도가 높고 반올림 오류를 피하기 쉽기 때문에 십진법 유형을 사용하는 것이 좋습니다. 돈과 통화)
Double 64비트(15-16자리) Double 유형은 아마도 돈 처리를 제외하고 실제 값에 대해 가장 일반적으로 사용되는 데이터 유형일 것입니다. 가장 정확한 답이 필요하지 않은 정수가 아닌 수학에는 double을 사용하십시오.
Float 32비트(7자리) 처리 능력에 대한 요구가 매우 높고 반올림 오류를 견딜 수 있는 상황에서도 사용되기 때문에 그래픽 라이브러리에서 주로 사용됩니다.
Decimals
double/float
보다 훨씬 느립니다.
Decimals
과 Floats/Doubles
는 캐스트 없이 비교할 수 없지만 Floats
와 Doubles
는 할 수 있습니다.
Decimals
는 인코딩 또는 후행 0도 허용합니다.
이들 각각의 주요 차이점은 정밀도입니다.
float
는 32-bit
숫자, double
은 64-bit
숫자, decimal
은 128-bit
숫자입니다.
값을 다음과 같이 언급해야 합니다.
Decimal dec = 12M/6; Double dbl = 11D/6; float fl = 15F/6;
그리고 결과를 확인합니다.
Float - 4 Double - 8 Decimal - 12
출처 : http:www.stackoverflow.com/questions/618535/difference-between-decimal-float-and-double-in-net
두 개정 간에 변경된 파일 표시 (0) | 2021.11.25 |
---|---|
링크처럼 작동하는 HTML 버튼을 만드는 방법 (0) | 2021.11.25 |
한 번에 여러 예외를 포착하시겠습니까? (0) | 2021.11.25 |
브라우저 창의 div 높이를 100%로 만드는 방법 (0) | 2021.11.25 |
Python 사전에서 키를 제거하려면 어떻게 해야 합니까? (0) | 2021.11.25 |