Double 변수를 십진수로 캐스트


96

어떻게 캐스트 a를 수행 doubledecimal통화 개발을 할 때 어떤 사용된다. 어디로 M갑니까?

decimal dtot = (decimal)(doubleTotal);

답변:


85

M캐스트 할 때는 숫자 리터럴 에만 사용합니다 .

decimal dtot = (decimal)doubleTotal;

부동 소수점 숫자는 정확한 값을 유지하는 데 적합하지 않으므로 먼저 숫자를 더한 다음로 변환 Decimal하면 반올림 오류가 발생할 수 있습니다. 숫자를 Decimal더하기 전에 숫자를로 변환 하거나 처음에 숫자가 부동 소수점 숫자가 아닌지 확인할 수 있습니다.


후속 질문으로 명시 적 변환이 필요한 이유는 무엇입니까? 나는 그것을 시도했고 double은 명시 적으로 십진수로 캐스팅 할 수 없지만 십진수가 더 많은 정밀도를 가지고 있지 않다는 오류가 발생합니다. (즉, int에서 double로 캐스팅하는 것과 매우 유사합니다.)

4
@Cortana : 소수의 정밀도는 더 높지만 범위는 더 작습니다. double 값은 10 진수 범위를 벗어날 수 있습니다. 참조 : stackoverflow.com/questions/7817866/…
Guffa

41

다음과 같이 M리터럴 접미사 없이 double을 십진수로 캐스트 할 수 있습니다 .

double dbl = 1.2345D;
decimal dec = (decimal) dbl;

M새 리터럴 10 진수 값을 선언 할 때 다음을 사용해야합니다 .

decimal dec = 123.45M;

(이 없으면 M123.45는 double로 처리되고 컴파일되지 않습니다.)


28

기본 변환 클래스 사용 : Convert.ToDecimal(Double)


1
OverflowException이 발생하므로 아니요 double vol_y = (double) Decimal.MaxValue + 10E + 28D; Console.WriteLine ( "Convert.ToDecimal (vol_y) ="+ Convert.ToDecimal (vol_y));
ToXinE

2
@ToXinE IMHO 대부분의 경우 OverflowException은 자동으로 잘못된 데이터를 생성하는 것보다 낫습니다
this.myself

16
Convert.ToDecimal(the double you are trying to convert);

2
Convert 클래스가 C #의 캐스트보다 훨씬 유연하고 안전하다는 것을 배웠습니다.
Tom

3
"안전한"? 캐스팅 할 수 없을 때와 같이 런타임에 컴파일러 오류 대신 예외가 발생합니까? 나는 너무 많이 물 렸기 때문에 전환을 적극적으로 피했습니다 ...
Peter Ritchie

8
@PeterRitchie 스레드는 조금 오래되었지만 다음과 같이 말해야합니다. Convert 메서드를 직접 호출하는 것이 더 적절한 방법입니다. 아마도 나는 최적화에 관심이 많지만 해결해야 할 명령이 하나 적다는 것은 보너스입니다 (명시적인 (Type) 캐스트 구문을 사용하는 것은 Convert를 호출하는 연산자 오버로드이기 때문입니다).
Mike Johnson

2
@PeterRitchie은 : 언어 설계의 관점에서, 오히려에서 배역 수보다 두 변환 방법 중 하나를 사용하는 프로그래머를 필요로하는 것이 더했을 double로를 decimalA에 대한 주어진, double어떤 경우에는 (1000000.0 / 3.0)와 같은 값 한 것 333333.333333333D를 산출하는 "초과"정밀도를 자르고 싶지만 다른 경우에는 333333.333333333313931D를 산출하여 유지하고 싶을 것입니다. 단순히 "10 진수로 변환"이라고 말하는 것이 아니라 코드에서 변환 수행 방법을 지정해야합니다.
supercat 2014 년

2
사용하기 때문에 정말 내 첫 코멘트와 관련이없는 것 같다 @supercat은 Convert.ToDecimal(double)과 동일한 (decimal)doubleTotal경우를 제외하고, doubleTotal다른 유형으로 변경 당신은 아마 컴파일 타임 오류가 발생하지 않도록하고 있기 때문에 더 열심히 - 투 - 찾기 런타임 오류를 소개하는 것 다른 ToDecimal 재정의가 호출 될 수 있습니다. 캐스트 연산자가 훨씬 더 명시 적입니다 ...
Peter Ritchie

1

음 이것은 오래된 질문이며 실제로 여기에 표시된 답변 중 일부를 사용했습니다. 그럼에도 불구하고 내 특정 시나리오에서는 double변환하려는 값 decimaldecimal.MaxValue. 그래서 예외를 처리하는 대신이 확장 메서드를 작성했습니다.

    public static decimal ToDecimal(this double @double) => 
        @double > (double) decimal.MaxValue ? decimal.MaxValue : (decimal) @double;

위의 접근 방식은 오버플로 예외 처리를 방해하지 않고 그러한 일이 발생하면 가능한 최대 값 (내 경우)을 유지하려는 경우에 작동하지만 다른 많은 시나리오에서는 이것이 예상되는 동작이 아님을 알고 있습니다. 예외 처리가 필요할 수 있습니다.


1
다음과 같은 경우 실패합니다. double _double = (double) decimal.MaxValue; 비교 public static decimal ToDecimal (this double _double) => _double> = (double) decimal.MaxValue? decimal.MaxValue : (십진수) _double;
Martin Eyles 2019 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.