programing

.NET에서 소수점, 부동소수점 및 이중점의 차이는 무엇입니까?

firstcheck 2023. 6. 2. 23:00
반응형

.NET에서 소수점, 부동소수점 및 이중점의 차이는 무엇입니까?

사이의 차이점은 무엇입니까?decimal,float그리고.doubleNET 서?

누가 이걸 언제 쓰겠어요?

float: ("C# 칭별의:System.Single및 ) 및double: ("C# 칭별의:System.Double)는 부동 이진유형입니다. float32비트입니다.double64비트입니다.말로 은 다음과 : 다, 음과같숫나타냅다니를자.

10001.10010110011

이진 숫자와 이진 포인트의 위치는 모두 값 내에서 인코딩됩니다.

decimal: ("C# 칭별의:System.Decimal)은 부동 소수점 유형입니다.즉, 다음과 같은 숫자를 나타냅니다.

12345.65789

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

중요한 점은 인간이 정수가 아닌 숫자를 십진수 형식으로 표현하는 데 익숙하고 십진수 표현으로 정확한 결과를 기대한다는 것입니다. 모든 십진수가 이진 부동 소수점(예: 0.1)으로 정확하게 표현되는 것은 아닙니다. 따라서 이진 부동 소수점 값을 사용하면 실제로 0.1에 가까운 값을 얻을 수 있습니다.부동 소수점을 사용할 때도 근사치를 얻을 수 있습니다. 예를 들어, 1을 3으로 나눈 결과는 정확하게 표현할 수 없습니다.

다음과 같은 경우 사용할 항목:

  • 정확한 은 " 연스럽정확소수한게좋다"를 .decimal이것은 보통 인간이 발명한 모든 개념에 적합합니다. 재정적 가치가 가장 명백한 예이지만 다른 것들도 있습니다.예를 들어, 다이빙 선수나 아이스 스케이트 선수에게 주어지는 점수를 생각해 보세요.

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

정밀도가 가장 큰 차이점입니다.

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

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

10진수 -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
+---------+----------------+---------+----------+---------------------------------------------------------+
| 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에서 수행되는 반면, 소수점 연산은 기본 10에서 수행되기 때문에 소수점 연산은 부동 소수점 연산보다 훨씬 느리고 대부분의 연산에서 두 배입니다(즉, 소수점 연산은 MMX/SSE와 같은 FPU 하드웨어에서 처리되는 반면 소수점 연산은 소프트웨어에서 계산됨).
  • 소수점은 더 많은 정밀도 자릿수를 지원하지만 허용할 수 없을 정도로 작은 값 범위를 가집니다.따라서 소수는 많은 과학적 가치를 나타내는 데 사용될 수 없습니다.

다른 답변과 댓글에서 이미 답변한 수많은 좋은(그리고 일부 나쁜) 정보를 반복하지는 않겠지만, 후속 질문에 팁으로 답하겠습니다.

누가 이걸 언제 쓰겠어요?

카운트된 에 십진수 사용

측정값에 부동/이중 사용

몇 가지 예:

  • 돈 (우리는 돈을 세거나 돈을 재나요?)

  • distance(거리를 세는 것입니까, 거리를 측정하는 것입니까?*)

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

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

어떤 경우에는, 제가 공칭 거리라고 부르는 것이 실제로 거리를 '계산'하고 싶을 수도 있습니다.예를 들어, 우리는 도시까지의 거리를 보여주는 국가 표지판을 다루고 있으며, 이러한 거리는 소수점 이하의 숫자(xxx.xkm)를 넘지 않는다는 것을 알고 있습니다.

float 【例자 7】

double는 약 를 가지고 .

decimal는 약 있습니다.

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

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

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

기본 설정에서는 부동(시스템)합니다.싱글) 및 더블(시스템).Double)은 소수점(System)일 때 오버플로 검사를 사용하지 않습니다.10진수)는 항상 오버플로 검사를 사용합니다.

제 말은.

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

오버플로를 발생시킵니다.예외.

그러나 다음과 같은 이점은 없습니다.

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

&

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

앞서 언급했듯이 정수는 정수입니다. . ., .42, .007 ▁.▁▁point▁like▁they,'▁can다▁storet7없▁.니습수,00▁.저00▁.를포.정수가 아닌 숫자를 저장해야 하는 경우에는 다른 유형의 변수가 필요합니다.더블 타입 또는 플로트 타입을 사용할 수 있습니다.이러한 유형의 변수는 단어를 사용하는 대신 정확히 같은 방식으로 설정할 수 있습니다.int당신이 타이핑한double또는float다음과 같이:

float myFloat;
double myDouble;

(float는 "할 뿐입니다 "점"이라는 뜻의 "점"입니다.

둘 사이의 차이는 그들이 보유할 수 있는 숫자의 크기에 있습니다.위해서float숫자는 최대 7자리까지 입력할 수 있습니다.위해서double할 수 , "16자리와 "16자리"를 사용할 수 있습니다.정확하게 인 크기는 과 같습니다: 정확히말하면크, 공적인다같다습니음과기는더식▁to다같:니습다▁here▁size음.

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

float이고, 는32트숫며이자비,double64비트 숫자입니다.

새 단추를 두 번 클릭하여 코드를 확인합니다.단추 코드에 다음 세 줄을 추가합니다.

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

프로그램을 중지하고 코딩 창으로 돌아갑니다.이 줄 변경:

myDouble = 0.007;
myDouble = 12345678.1234567;

프로그램을 실행하고 더블 버튼을 클릭합니다.메시지 상자에 번호가 올바르게 표시됩니다.그러나 끝에 다른 숫자를 추가하면 C#이 다시 올림 또는 내림됩니다.정확성을 원한다면 반올림을 조심해야 한다는 교훈이 있습니다!

  1. 더블과 플로트는 컴파일과 실행 시간 모두에서 예외 없이 정수 0으로 나눌 수 있습니다.
  2. 10진수는 정수 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개의 유의한 숫자)

이것은 저에게 흥미로운 실마리였습니다. 오늘, 우리는 끔찍한 작은 벌레를 가지고 있었습니다.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 값의 경우 사용하면 값이 완전히 손실됩니다.그러한 예 중 하나는

  • 셀 값 = 0.00006317592

  • 십진법.구문 분석(셀 값)을 사용합니다.ToString(), out); // 0을 반환합니다.

이상하게도, 그 해결책은 엑셀 값을 다음과 같이 변환하는 것이었습니다.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;
    …
}

그럼에도 불구하고.doublea보다 정밀도가 낮습니다.decimal이것은 실제로 소수가 여전히 인식될 수 있도록 보장했습니다.어떤 이유에서인지, 실제로는 그렇게 작은 숫자들을 검색할 수 있었지만, 그 숫자들을 0으로 설정할 수 있었습니다.

이상해요, 아주 이상해요

소수, 이중 및 부동 변수 유형은 값을 저장하는 방식이 다릅니다.정밀도는 부동 소수점 데이터 유형이 단일 정밀도(32비트) 부동 소수점 데이터 유형이고 이중 정밀도(64비트) 부동 소수점 데이터 유형이 128비트 부동 소수점 데이터 유형인 주요 차이점입니다.

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

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

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

추가 정보...소수점, 부동 소수점 및 이중점의 차이

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

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

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.0999999이고 1.1보다 낮다는 것입니다.

주의:소수점은 더 높은 정밀도를 가진 2배에 불과하고 정밀도는 항상 한계가 있기 때문에 다른 숫자에도 동일한 문제가 분명히 존재할 수 있다고 생각합니다.

사실, 더블, 플로트, 그리고 십진법은 코볼에서 이진법 십진법에 해당합니다!

COBOL에 구현된 다른 숫자 유형은 에 존재하지 않는 것이 유감입니다.넷. 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)
/==========================================================================================
You can read more 여기서, 흘러가다, 더블, and 십진법.

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

  • float 숫자 입니다.
  • double 숫자 입니다.
  • decimal 숫자 입니다.

플로트:

부동 이진 점 유형 변수입니다.즉, 이진 형식으로 숫자를 나타냅니다.플로트는 단일 정밀도입니다.32 bits(6-9 significant figures)가 매우 높기 에 그래픽 되며, 가 그다지 중요하지에서도 사용됩니다.처리 능력에 대한 요구가 매우 높기 때문에 그래픽 라이브러리에서 주로 사용되며 반올림 오차가 그다지 중요하지 않은 조건에서도 사용됩니다.

두 배:

또한 두 배의 정밀도를 갖는 부동 이진 점 유형 변수입니다.64 bits size(15-17 significant figures)이중은 재무 애플리케이션과 높은 정확도가 필요한 장소를 제외하고 실제 가치에 가장 일반적으로 사용되는 데이터 유형입니다.

십진수:

부동 소수점 유형 변수입니다., 즉, 십를사여숫나자타를니다냅용하수진▁▁decimal▁▁number,다ents를 사용하여 숫자를 나타낸다는 뜻입니다.(0-9)그것은 사용합니다.128 bits(28-29 significant figures)데이터를 저장하고 표현하는 데 사용됩니다.따라서 플로트 및 더블보다 정밀도가 높습니다.정밀도가 높고 반올림 오류를 피하기 쉽기 때문에 주로 재무 애플리케이션에 사용됩니다.

예:

using System;
  
public class GFG {
  
    static public void Main()
    {
  
        double d = 0.42e2;    //double data type
        Console.WriteLine(d); // output 42
  
        float f = 134.45E-2f;  //float data type
        Console.WriteLine(f); // output: 1.3445
  
        decimal m = 1.5E6m;   //decimal data type
        Console.WriteLine(m); // output: 1500000
    }
}

다음을 기준으로 부동 소수점, 이중 소수점 및 소수점 비교:

사용된 비트 수:

  • Float은 32비트를 사용하여 데이터를 나타냅니다.
  • Double은 64비트를 사용하여 데이터를 나타냅니다.
  • 십진수는 128비트를 사용하여 데이터를 나타냅니다.

값 범위:

  • 플로트 값의 범위는 약 ±1.5e-45 ~ ±3.4e38입니다.

  • 이중 값의 범위는 약 ±5.0e-324 ~ ±1.7e308입니다.

  • 10진수 값의 범위는 약 ±1.0e-28 ~ ±7.9e28입니다.

정밀도:

  • 부동 소수점은 단일 정밀도로 데이터를 나타냅니다.
  • 데이터를 두 배의 정밀도로 나타냅니다.
  • 소수점이 부동 소수점과 이중점보다 정밀도가 높습니다.

정확도:

  • 부동 소수점과 이중 소수점보다 정확도가 낮습니다.
  • 이중은 부동 소수점보다 정확하지만 소수점보다 정확하지 않습니다.
  • 소수점이 부동 소수점과 이중점보다 정확합니다.

소수점, 부동 소수점 및 이중점을 정의하려면 에서망(c#)

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

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

결과를 확인합니다.

각 사용자가 차지하는 바이트 수는

Float - 4
Double - 8
Decimal - 12

언급URL : https://stackoverflow.com/questions/618535/difference-between-decimal-float-and-double-in-net

반응형