무엇 사이의 차이 decimal
, float
그리고 double
.NET에?
누군가이 중 하나를 언제 사용합니까?
답변
float
하고 double
있습니다 부동 이진 소수점 형식을 . 즉, 다음과 같은 숫자를 나타냅니다.
10001.10010110011
이진수와 이진수의 위치는 모두 값 내에 인코딩됩니다.
decimal
A는 부동 소수점 포인트 유형 . 즉, 다음과 같은 숫자를 나타냅니다.
12345.65789
다시 말하지만, 소수점 의 숫자와 위치 는 모두 값 내에 인코딩됩니다 decimal
. 이것이 고정 소수점 유형 대신 부동 소수점 유형을 만드는 것입니다.
주의해야 할 중요한 점은 인간은 정수가 아닌 정수를 10 진수 형식으로 나타내는 데 사용되며 10 진수로 정확한 결과를 기대한다는 것입니다. 모든 소수를 이진 부동 소수점 (예 : 0.1)으로 정확하게 표현할 수있는 것은 아닙니다. 따라서 이진 부동 소수점 값을 사용하면 실제로는 대략 0.1이됩니다. 부동 소수점을 사용할 때도 근사값을 얻을 수 있습니다. 예를 들어 1을 3으로 나눈 결과는 정확하게 표현할 수 없습니다.
언제 사용 하는가에 관해서 :
-
“자연스럽게 정확한 소수”인 값의 경우을 사용하는 것이 좋습니다
decimal
. 이것은 일반적으로 인간이 발명 한 모든 개념에 적합합니다. 재무 가치가 가장 분명한 예이지만 다른 것도 있습니다. 예를 들어 다이버 나 아이스 스케이터에게 주어진 점수를 고려하십시오. -
정말 측정 할 수없는 성격의 많은 유물입니다 값에 대해서는 정확히 어쨌든,
float
/double
더 적합합니다. 예를 들어 과학 데이터는 일반적으로이 형식으로 표시됩니다. 여기서 원래 값은 “소수 적으로 정확”하지 않으므로 예상 결과가 “소수 정확도”를 유지하는 것은 중요하지 않습니다. 부동 이진 소수점 유형은 소수보다 작업 속도가 훨씬 빠릅니다.
답변
주요 차이점은 정밀성입니다.
부동 -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
답변
Decimal 구조는 정확성을 요구하는 재무 계산에 엄격하게 맞춰져 있으며, 이는 상대적으로 반올림을 허용하지 않습니다. 그러나 십진법은 몇 가지 이유로 과학적 응용에는 적합하지 않습니다.
- 많은 과학적 계산에서 측정되는 물리적 문제 나 아티팩트의 실제 한계로 인해 특정 정밀도 손실이 허용됩니다. 금융에서 정밀도 손실은 허용되지 않습니다.
- 십진법은 대부분 부동 소수점 연산이 부동 소수 점수보다 두 배 느립니다. 대부분 부동 소수점 연산은 2 진법으로 이루어 지지만 10 진수는 10 진법으로 이루어집니다 (즉, 부동 소수 점수는 MMX / SSE와 같은 FPU 하드웨어에 의해 처리됩니다) , 소수는 소프트웨어에서 계산됩니다).
- 십진수는 더 많은 자릿수를 지원한다는 사실에도 불구하고 두 배보다 허용 할 수 없을 정도로 작은 값 범위를 갖습니다. 따라서 Decimal은 많은 과학적 가치를 나타내는 데 사용될 수 없습니다.
답변
+---------+----------------+---------+----------+---------------------------------------------+
| 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 |
+---------+----------------+---------+----------+---------------------------------------------+
답변
다른 답변과 의견에 이미 답변 된 좋은 (그리고 일부 나쁜) 정보를 반복하지는 않지만 다음 질문에 대한 팁으로 답변 해 드리겠습니다.
누군가이 중 하나를 언제 사용합니까?
계산 된 값에 10 진수 사용
측정 값에 float / double 사용
몇 가지 예 :
-
돈 (돈을 세거나 돈을 측정합니까?)
-
거리 (거리를 세거나 거리를 측정합니까? *)
-
점수 (점수를 세거나 점수를 측정합니까?)
우리는 항상 돈을 세고 측정해서는 안됩니다. 우리는 보통 거리를 측정합니다. 우리는 종종 점수를 계산합니다.
* 경우에 따라 공칭 거리 라고 부르는 것은 실제로 거리를 계산하는 것이 좋습니다. 예를 들어, 도시까지의 거리를 나타내는 국가 표시를 처리하고있을 수 있으며 해당 거리는 10 진수 (xxx.xkm)를 초과하지 않습니다.
답변
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;