c# - 페이지 - vb net 인쇄 미리 보기




십진수를 더블로 변환 하시겠습니까? (9)

트랙 바를 사용하여 양식의 불투명도를 변경하고 싶습니다.

이것은 내 코드입니다.

decimal trans = trackBar1.Value / 5000;
this.Opacity = trans;

응용 프로그램을 빌드하면 다음과 같은 오류가 발생합니다.

암시 적으로 'decimal' 형식을 'double' 형식으로 변환 할 수 없습니다.

transdouble 사용해 보았지만 컨트롤이 작동하지 않습니다. 이 코드는 과거의 VB.NET 프로젝트에서 잘 작동했습니다.


"Decimal vs Double"이라는 일반적인 질문에 대한 좀 더 일반적인 답변 : 정밀도를 유지하기 위해 통화 계산의 소수점, 작은 차이에 영향을받지 않는 과학적 계산을위한 Double . Double은 CPU 고유의 유형이므로 (내부 표현은 기본 2에 저장 됨) Double을 사용하여 계산 한 다음 Decimal을 더 잘 수행합니다 (내부 10 진수로 표현됨).


VB.NET에서는 코드가 암묵적으로 캐스트를 수행하기 때문에 코드가 잘 작동하는 반면 C #에는 암시 적 및 명시 적 코드가 모두 있기 때문에 코드가 잘 작동합니다.

C #에서는 십진수에서 두배로의 변환이 정확도를 잃어 버릴 때 명시 적입니다. 예를 들어, 1.1은 double로 정확하게 표현 될 수 없지만 10 진수로 표현할 수 있습니다 (이유는 " 부동 소수점 수 - 사용자가 생각하는 것보다 정확하지 않음"참조).

VB에서 컴파일러에 의해 변환이 추가되었습니다.

decimal trans = trackBar1.Value / 5000m;
this.Opacity = (double) trans;

(double) C #에서 명시 적으로 명시해야하지만 VB의 더 용서 컴파일러에 의해 암시 될 수 있습니다.


가장 좋은 해결책은 다음과 같습니다.

this.Opacity = decimal.ToDouble(trackBar1.Value/5000);

두 가지 문제가 있습니다. 첫째, Opacity 는 십진수가 아닌 이중 값을 필요로합니다. 컴파일러는 10 진수와 2 진수 사이의 변환이 있지만 명시적인 변환이 작동하도록 지정해야한다는 것을 알려줍니다. 두 번째는 TrackBar.Value 가 정수 값이고 int를 int로 나누는 것은 어떤 유형의 변수를 할당했는지에 관계없이 int가됩니다. 이 경우에는 int에서 decimal 또는 double로 암시 적 캐스트가 이루어집니다. 캐스트를 수행 할 때 정밀도가 손실되지 않기 때문에 컴파일러에서 불평하지 않지만 얻을 수있는 값은 항상 0, 아마도 trackBar.Value 이후 trackBar.Value 은 항상 5000보다 작습니다. 해결 방법은 코드를 변경하여 Double (불투명도의 기본 유형)을 사용하고 명시 적으로 상수를 두 번으로하여 부동 소수점 산술을 수행하는 것입니다. 이는 산술을 승격시키는 효과가 있습니다. 또는 trackBar.Value 캐스팅 trackBar.Value . 같은 것을하거나 둘 다 할 수있는 두 배의 trackBar.Value . 아, 다른 곳에서 사용하지 않으면 중간 변수가 필요 없습니다. 내 생각 엔 컴파일러가 어쨌든 그것을 최적화 할 것입니다.

trackBar.Opacity = (double)trackBar.Value / 5000.0;

이와 같이 두 번 명시 적으로 캐스트하는 것은 필요하지 않습니다.

double trans = (double) trackBar1.Value / 5000.0;

상수를 5000.0 (또는 5000d )으로 식별하는 것으로 충분합니다.

double trans = trackBar1.Value / 5000.0;
double trans = trackBar1.Value / 5000d;

제 의견으로는 가능한 한 명백하게하는 것이 바람직합니다. 이렇게하면 코드가 명확 해지고 결국 프로그래머가 읽을 수있게됩니다.

숫자에 .0 을 추가하는 것 외에 (또는 대신) decimal.ToDouble() 사용할 수 있습니다.

여기 예시들이 있습니다 :

// Example 1
double transperancy = trackBar1.Value/5000;
this.Opacity = decimal.ToDouble(transperancy);

// Example 2 - with inline temp
this.Opacity = decimal.ToDouble(trackBar1.Value/5000);

5000 대신 5000.0 사용해야합니다.


Opacity 가 이중 값이기 때문에 처음부터 이중을 사용하고 전혀 캐스팅하지 않을 것이지만 분할 할 때 이중을 사용하여 정밀도를 잃지 않도록하십시오.

Opacity = trackBar1.Value / 5000.0;

this.Opacity = trackBar1.Value / 5000d;




decimal