카테고리 보관물: C#

C#

십진수를 두 배로 변환 다음 오류가 발생합니다. 암시 적으로 유형

의을 사용하여 불투명도 Track-Bar를 변경 하고 싶습니다 Form.

이것은 내 코드입니다.

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

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

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

내가 사용하는 시도 trans하고 double있지만 다음은 Control작동하지 않습니다. 이 코드는 과거 VB.NET 프로젝트에서 잘 작동했습니다.



답변

double이것을 좋아 하는 캐스트 는 필요하지 않습니다.

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

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

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


답변

일반적인 질문 “Decimal vs Double?”에 대한보다 일반적인 대답 : 정밀도를 유지하기위한 통화 계산의 10 진수 , 작은 차이의 영향을받지 않는 과학 계산의 경우 Double . Double은 CPU 고유의 유형이므로 (내부 표현은 기본 2에 저장 됨 ) Double을 사용한 계산은 10 진 ( 내부 10으로 표시)보다 성능이 우수 합니다.


답변

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

C #에서는 정확도를 잃을 때 십진수에서 double 로의 변환이 명시 적입니다. 예를 들어 1.1은 정확하게 double로 표현할 수 없지만 10 진수로 표현할 수 있습니다 ( 이유로 인해 ” 부동 소수점 수-생각보다 정확하지 않음”참조).

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

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

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


답변

왜 5000으로 나눕니 까? TrackBar의 최소값과 최대 값을 0에서 100 사이로 설정 한 다음 불투명도 백분율로 값을 100으로 나눕니다. 아래의 최소 20 가지 예는 양식이 완전히 보이지 않게합니다.

private void Form1_Load(object sender, System.EventArgs e)
{
    TrackBar1.Minimum = 20;
    TrackBar1.Maximum = 100;

    TrackBar1.LargeChange = 10;
    TrackBar1.SmallChange = 1;
    TrackBar1.TickFrequency = 5;
}

private void TrackBar1_Scroll(object sender, System.EventArgs e)
{
    this.Opacity = TrackBar1.Value / 100;
}


답변

두 가지 문제가 있습니다. 첫째, Opacity10 진수 값이 아닌 2 배가 필요합니다. 컴파일러는 십진수와 이중 변환 사이에 변환이 있지만 작동하려면 명시 적으로 지정해야한다고 명시하고 있습니다. 두 번째는 TrackBar.Value정수 값이며 int를 int로 나누면 변수 유형에 관계없이 int가됩니다. 이 경우 int에서 decimal 또는 double 로의 암시 적 캐스트가 있습니다-캐스트를 할 때 정밀도 손실이 없기 때문에 컴파일러는 불평하지 않지만 얻을 수있는 값은 항상 0입니다.trackBar.Value이 솔루션은 두 배 (불투명도에 대한 기본 유형)를 사용하는 코드를 변경하고 명시 적으로 이중 상수를하여 부동 소수점 연산 않는 적은 5000보다 항상 – 또는 주조 – 산술 증진의 효과가되는 trackBar.Value두 배를 동일한 작업을 수행하거나 둘 다 수행합니다. 아, 그리고 다른 곳에서 사용하지 않으면 중간 변수가 필요하지 않습니다. 내 생각 엔 컴파일러가 어쨌든 최적화 할 것입니다.

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


답변

제 생각에는 가능한 한 명시적인 것이 바람직합니다. 이것은 코드에 명확성을 추가하고 결국 코드를 ​​읽을 수있는 동료 프로그래머에게 도움이됩니다.

.0숫자에 a 를 추가하는 대신 (또는 대신) 을 사용할 수 있습니다 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);


답변

this.Opacity더블 값인 것처럼 들리며 , 컴파일러는 십진수 값을 넣는 것을 좋아하지 않습니다.