2011-03-21 2 views

답변

14

Decimal.Multiply을 사용하면 곱셈기는 사용중인 형식이 아닌 decimal이 아닌 decimal 형식의 입력을 사용하게됩니다.

Decimal.Multiply(decimal d1, decimal d2)을 입력하고 decimal 유형을 시행하고 출력합니다. * 당신이 할 수있는 경우 : 이것은 당신이 어떤 경우에 믹스 앤 매치 타입 할 수 있으며 당신을 위해 모든 것을 처리 할 수 ​​있지만, 유형이 소수점 오른쪽이 방법에 따라이 보장되지

decimal result = yourDecimal * yourInt; 

한정된.

+0

좋은 지적. Chris가 지적한 것처럼 가독성 문제뿐만 아니라 곱셈을 사용하는 유형 안전 방법입니다. 좋은! –

+1

나는 당신이하는 말을 잘 모르겠습니다. 어쨌든 십진법 연산을하기 위해 곱셈이 일어나기 전에'int' 값은 암묵적으로'decimal'로 변환됩니다. 두 개의 int 값을 곱해서 문제가 될 수있는 10 진수로 지정한다면, 'Multiply' 메서드를 사용하지 않고 먼저 10 진수로 변환하여 처리 할 수 ​​있습니다. – tvanfosson

+0

당신이 그것을 정확하게 의미하는 것 같아요 당신의 예제는 당신이 당신이 물론 Decimal.Multiply (yourDecimal, yourInt)'할 수없는 _ 제안하지 않는 것 같습니다 - int에서 decimal로 암시 적 변환이 있습니다. Decimal.Multiply를 사용하는 경우에만 _decimal_ 곱셈을 사용할 수 있습니다. 예를 들어 중요 할 수 있습니다. 'int i1 = 1000000; decimal x = Decimal.Multiply (i1, i1); ' – Mormegil

11

* 연산자 과부하 내부적 Multiply 호출된다. 정말 가독성 문제입니다.

+0

'decimal result = int.MaxValue * 2;' – mgronber

+2

@mgronber - 이것이 '곱하기'를 사용하는 이유가 아니기 때문에 정수 오버플로를 이해하고 연산에 올바른 유형을 사용하며 타입 캐스팅/승격을해야합니다. 이런 경우에'Multiply '를 호출하는 사람을 찾으면 정확한 할 일은 숫자를 표현하고 올바른 유형을 선택 (캐스팅)하는 것에 대한 토론을하는 것입니다. 엄밀히 말하자면,이 질문에 대한 말은, 적어도 '100 * 200'이 훨씬 더 읽기 쉽기 때문에, 적어도 저에게 답이되는 것은 아닙니다.'100m * 200m '이라고 쓰면 더 읽기 쉽습니다. 유형. – tvanfosson

+0

아, 그래, 그 경우에는 RHS가 정수로 평가 될 것입니다 (오버플로). 반면 Decimal.Multiply 솔루션은 오버플로되지 않습니다. 따라서'* '연산자로 이것을 호출하는 올바른 방법은'(decimal) int.MaxValue * (decimal) 2'입니다. –

4

일부 언어는 오버로드 된 연산자를 지원하지 않습니다. 이들은 Multiply() 메서드를 호출해야합니다.

1

소수 자릿수를 직접 지원하는 .NET 언어는 필요하지 않지만 이러한 언어에서는 System.Decimal 구조체를 계속 사용할 수 있습니다. .NET 언어 지원 연산자가 재정의 될 필요가 없으므로 이러한 경우에 전체 사용을 허용하려면 메서드가 필요합니다.

+0

@Eric, Managed C++가 CLS를 준수하지 않거나 10 진수를 직접 지원하지 않는다고 잘못 생각하고 있습니다. 아니면 연산자 오버로드를 통해 호환되며 연산자 오버로딩이없는 언어가 연산자를 십진수로 계속 지원해야합니까? –

+1

좋은 질문입니다. 저는 CLS 사양의 변호사가 아닙니다. 사양이 나오기 시작하면 다소 모호합니다. C++/CLI의 전문가가 아니기 때문에 추측을 위험하게하지는 않습니다. –

8

* 연산자는 10 진수 형식에 대해 오버로드되며 Decimal.Multiply()과 동일합니다. 그러나 오버로드 된 * 연산자는 매개 변수 중 하나 이상이 10 진수이어야합니다. 그렇지 않으면 다른 * 연산자가 호출됩니다. decimal result = 100 * 200에서는 int 유형을 먼저 곱한 다음 10 진수로 변환합니다. 곱셈 결과가 Int32.MaxValue보다 큰 경우 오버플로가 발생합니다.

decimal d1 = 2147483647 * 2; // Overflow 
decimal d2 = 2147483647m * 2; // OK 
decimal d3 = Decimal.Multiply(2147483647, 2); // OK 
관련 문제