문제

의 차이는 무엇입 decimal, floatdouble 습니다.NET?

을 때 누군가가 중 하나를 사용하여 이?

도움이 되었습니까?

해결책

float 그리고 double ~이다 떠 있는 이진 포인트 유형. 다시 말해, 그들은 다음과 같은 숫자를 나타냅니다.

10001.10010110011

이진 수와 이진 지점의 위치는 둘 다 값 내에서 인코딩됩니다.

decimal a 떠 있는 소수 포인트 유형. 다시 말해, 그들은 다음과 같은 숫자를 나타냅니다.

12345.65789

다시, 숫자와 위치 소수 포인트는 모두 값 내에서 인코딩됩니다. decimal 고정 점 유형 대신 플로팅 포인트 유형입니다.

주목해야 할 중요한 점은 인간이 소수점 형태의 비 인수를 나타내는 데 사용되며 소수점 표현이 정확한 결과를 기대한다는 것입니다. 예를 들어 바이너리 플로팅 포인트 (예 : 0.1)에서 모든 소수점 숫자가 정확하게 표현되는 것은 아닙니다. 따라서 바이너리 플로팅 포인트 값을 사용하면 실제로 0.1로 근사가됩니다. 플로팅 소수점을 사용할 때도 여전히 근사치를 얻을 수 있습니다. 예를 들어 1을 3으로 나누는 결과는 정확히 표현 될 수 없습니다.

언제 사용 해야하는지 :

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

  • 실제로 측정 할 수없는 자연의 인공물 인 가치에 대해 바로 그거죠 그래도, float/double 더 적합합니다. 예를 들어, 과학적 데이터는 일반적 으로이 형태로 표시됩니다. 여기서 원래의 값은 시작하기에 "신분 적으로 정확하지"않으므로 예상 결과가 "소수 정확도"를 유지하는 것은 중요하지 않습니다. 플로팅 바이너리 포인트 유형은 소수점보다 작업하기가 훨씬 빠릅니다.

다른 팁

정밀도가 주요 차이점입니다.

뜨다 -7 자리 (32 비트)

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

소수 -28-29 중요한 숫자 (128 비트)

데시 말은 정밀도가 훨씬 높으며 일반적으로 높은 정확도가 필요한 재무 응용 프로그램 내에서 사용됩니다. 데시 말은 더블/플로트보다 훨씬 느리게 (일부 테스트에서 최대 20 배)입니다.

부유물과 복식은 캐스트 없이는 비교할 수없고 부유물/복식은 비교할 수 없습니다. 데시 말은 또한 인코딩 또는 후행 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

소수점 구조은 엄격하게 설치하는 재정 계산을 요구하는 정확성,상대적으로 알러지 반올림.소수하지 않은 적절한 과학적인 응용 프로그램이있다,그러나,여러 가지 이유로:

  • 특정 손실의 정밀도에서 허용되는 많은 과학적인 계산기 때문에 실제적인 제한의 실제 문제 또는 유물은 측정됩니다.정밀도의 손실은 허용되지 않습에서 금융입니다.
  • 수가 많(많은)보다 느린 플로트와 이중 대부분의 작업을 주로하기 때문에,부동 소수점 연산이 수행에 바이너리,반면 진수 재료에서 수행되는 기 10(즉수레와 복식에 의해 처리됩 FPU 와 같은 하드웨어 MMX/SSE 하는 반면,소수이 계산되는 소프트웨어에서).
  • 수가 용납할 수 없을 만큼 작은 값의 범위를 두 배 이상이라는 사실에도 불구하고,그것을 지원하는 이상의 숫자의 정밀도입니다.따라서,소수할 수 없습을 나타내는 데 사용되는 많은 과학적인 값입니다.
+---------+----------------+---------+----------+---------------------------------------------+
| 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                               |
+---------+----------------+---------+----------+---------------------------------------------+

자세한 내용은 다음을 참조하십시오.
http://social.msdn.microsoft.com/forums/en-us/csharpgeneral/thread/921a8ffc-9829-4145-bdc9-a96c174a5

float 정밀도 7 자리

double 약 15 자리의 정밀도가 있습니다

decimal 약 28 자리의 정밀도가 있습니다

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

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

나는 이미 다른 답변과 의견으로 대답 한 수많은 좋은 (그리고 나쁜) 정보를 반복하지 않을 것이지만, 팁으로 후속 질문에 답할 것입니다.

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

소수점을 사용하십시오 계산 가치

float/double을 사용하십시오 정확히 잰 가치

몇 가지 예 :

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

  • 거리 (거리 또는 거리를 계산합니까? *)

  • 점수 (우리는 점수를 계산하거나 점수를 측정합니까?)

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

* 어떤 경우에는 내가 부를 것입니다 공칭 거리, 우리는 실제로 거리를 '계산'하고 싶을 수도 있습니다. 예를 들어, 우리는 도시와의 거리를 보여주는 국가 징후를 다루고있을 것입니다. 그리고 그 거리에는 10 개 이상의 소수점 숫자 (xxx.x km)가 없다는 것을 알고 있습니다.

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

기본 설정에서 플로트 (System.Single) 및 복식 (System.Double)은 오버플로 점검을 사용하지 않고 소수점 (System.Decimal)은 항상 오버플로 점검을 사용합니다.

내말은

decimal myNumber = decimal.MaxValue;
myNumber += 1;

던졌습니다 Overflowexception.

그러나 이것들은 다음과 같습니다.

float myNumber = float.MaxValue;
myNumber += 1;

&

double myNumber = double.MaxValue;
myNumber += 1;

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

float myFloat;
double myDouble;

(float "플로팅 포인트"는 짧고 끝에 어떤 점이있는 숫자를 의미합니다.)

둘 사이의 차이점은 보유 할 수있는 숫자의 크기입니다. 을 위한 float, 당신은 당신의 번호로 최대 7 자리를 가질 수 있습니다. 을 위한 doubleS, 최대 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#이 다시 반올림되거나 내려갑니다. 도덕은 정확성을 원한다면 반올림에주의하십시오!

  1. 이중 및 플로트는 컴파일 및 실행 시간 모두에서 예외없이 정수 제로로 나눌 수 있습니다.
  2. 소수점은 정수 제로로 나눌 수 없습니다. 그렇게하면 편집이 항상 실패합니다.

이것은 저에게 흥미로운 실이었습니다. 오늘처럼, 우리는 단지 불쾌한 작은 버그를 가지고있었습니다. decimal A보다 정밀도가 적습니다 float.

C# 코드에서는 Excel 스프레드 시트에서 숫자 값을 읽고 decimal, 나서 이것을 보내십시오 decimal 서비스로 돌아가서 SQL 서버 데이터 베이스.

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

이제 거의 모든 우리의 엑셀 값 중에서, 이것은 아름답게 작동했습니다. 그러나 매우 작은 엑셀 값의 경우 decimal.TryParse 가치를 완전히 잃었습니다. 그러한 예 중 하나는입니다

  • cellValue = 0.00006317592

  • Decimal.tryParse (cellValue.toString (), Out Value); // 돌아올 것입니다 0

기이 한 솔루션은 Excel 값을 다음으로 변환하는 것이 었습니다. double 먼저, 그런 다음 a 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 a보다 정밀도가 적습니다 decimal, 이것은 실제로 소수의 소수가 여전히 인식 될 수 있도록 보장합니다. 몇 가지 이유, double.TryParse 실제로 그런 작은 숫자를 검색 할 수 있었지만 decimal.TryParse 그것들을 0으로 설정했습니다.

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

  • 플로트 : ± 1.5 x 10^-45 ~ ± 3.4 x 10^38 (~ 7 개의 중요한 그림
  • 이중 : ± 5.0 x 10^-324 ~ ± 1.7 x 10^308 (15-16 중요한 수치)
  • 소수점 : ± 1.0 x 10^-28 ~ ± 7.9 x 10^28 (28-29 중요한 수치)

메모리와 성능이 중요한 게임 및 임베디드 시스템과 같은 응용 프로그램의 경우 플로트는 일반적으로 더 두 배의 크기와 절반의 크기의 숫자 유형입니다. 정수는 선택의 무기 였지만 플로팅 포인트 성능은 현대 프로세서에서 정수를 추월했습니다. 소수점이 바로 나옵니다!

소수점, 이중 및 플로트 변수 유형은 값을 저장하는 방식이 다릅니다. 정밀도는 플로트가 단일 정밀 (32 비트) 플로팅 포인트 데이터 유형 인 주요 차이이며, 더블은 이중 정밀 (64 비트) 플로팅 포인트 데이터 유형이고 10 진수는 128 비트 플로팅 포인트 데이터 유형입니다.

플로트 -32 비트 (7 자리)

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

10 진수 -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 비트 머신 송풍기에는 True가 포함되어 있습니다 !!!

Double By Decimal을 교체하면 송풍기에는 좋은 답변이 포함되어 있습니다.

두 배로, 문제는 fmean-fdelta = 1.0999999999가 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) 

간단한 말로 :

  1. 소수점, 이중 및 플로트 변수 유형은 값을 저장하는 방식이 다릅니다.
  2. 정밀도입니다 주요 차이 (이것은 단일 차이가 아님) 어디에서 뜨다 단일 정밀 (32 비트) 부동 소수점 데이터 유형입니다. 더블 이중 정밀 (64 비트) 플로팅 포인트 데이터 유형이며 소수 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 a 32-bit 숫자, double a 64-bit 숫자 및 decimal a 128-bit 숫자.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top