부동 소수점 유형을 사용하면 이점을 얻을 수 있습니다. 나는 모든 경우에 소수점을 설계하는 경향이 있으며 프로파일 러를 사용하여 소수점에 대한 작업으로 병목 현상이 발생하거나 속도가 느려지는지 알려줍니다. 이 경우, "다운 캐스트"를 두 번 또는 부동으로 내릴 수 있지만 내부적으로 만 수행하고 수행되는 수학 연산에서 유효 자릿수를 제한하여 정밀 손실을 신중하게 관리하려고합니다.
일반적으로 값이 일시적인 경우 (재사용되지 않는 경우) 부동 소수점 유형을 사용하는 것이 안전합니다. 부동 소수점 유형의 실제 문제점은 다음 세 가지 시나리오입니다.
- 부동 소수점 값을 집계하는 중입니다 (이 경우 정밀도 오류가 복합 됨)
- 부동 소수점 값을 기반으로 값을 작성합니다 (예 : 재귀 알고리즘)
- 당신은 유효 숫자의 매우 넓은 숫자와 수학을하고있다 (예를 들어
123456789.1 * .000000000000000987654321
)
편집하다
C # 소수에 대한 참조 문서에 따르면 :
진수 키워드는 128 비트의 데이터 타입을 나타낸다. 부동 소수점 유형과 비교할 때 10 진수 유형은 정밀도와 범위가 작기 때문에 재무 및 금전적 계산에 적합합니다.
위의 진술을 명확히하기 위해 :
나는 모든 경우에 소수점을 설계하는 경향이 있으며 프로파일 러를 사용하여 소수점에 대한 작업으로 병목 현상이 발생하거나 속도가 느려지는지 알려줍니다.
나는 소수가 유리한 산업에서만 일했습니다. 물리학 또는 그래픽 엔진을 사용하는 경우 부동 소수점 유형 (float 또는 double)을 설계하는 것이 훨씬 유리할 것입니다.
십진법은 무한정 정확하지 않지만 (원시 데이터 유형에서 비 적분에 대해 무한 정밀도를 나타내는 것은 불가능합니다), 이중보다 훨씬 더 정확합니다.
- 십진수 = 28-29 유효 숫자
- 두자리 수 = 15-16 자리
- float = 유효 숫자 7
편집 2
에 대한 응답으로 콘라드 루돌프 의 코멘트, 항목 # 1 (위) 확실히 맞습니다. 부정확 한 집계는 실제로 복잡합니다. 예제는 아래 코드를 참조하십시오.
private const float THREE_FIFTHS = 3f / 5f;
private const int ONE_MILLION = 1000000;
public static void Main(string[] args)
{
Console.WriteLine("Three Fifths: {0}", THREE_FIFTHS.ToString("F10"));
float asSingle = 0f;
double asDouble = 0d;
decimal asDecimal = 0M;
for (int i = 0; i < ONE_MILLION; i++)
{
asSingle += THREE_FIFTHS;
asDouble += THREE_FIFTHS;
asDecimal += (decimal) THREE_FIFTHS;
}
Console.WriteLine("Six Hundred Thousand: {0:F10}", THREE_FIFTHS * ONE_MILLION);
Console.WriteLine("Single: {0}", asSingle.ToString("F10"));
Console.WriteLine("Double: {0}", asDouble.ToString("F10"));
Console.WriteLine("Decimal: {0}", asDecimal.ToString("F10"));
Console.ReadLine();
}
이것은 다음을 출력합니다 :
Three Fifths: 0.6000000000
Six Hundred Thousand: 600000.0000000000
Single: 599093.4000000000
Double: 599999.9999886850
Decimal: 600000.0000000000
보시다시피, 동일한 소스 상수에서 추가하더라도 더블의 결과는 정확하지 않지만 (올바르게 반올림하지만) 플로트는 정확도가 떨어집니다. 유효 숫자 2 자리