십진수를 두 배로 변환


673

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

이것은 내 코드입니다.

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

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

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

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


11
또한 Decimal은 Double만큼 넓은 값을 나타낼 수 없습니다. 10 진수는 +/- 7.9228162514264337593543950335E + 28까지만 올라갈 수 있습니다. 반면 Double은 +/- 1.79769313486232E + 308까지 올라갈 수 있습니다
TraumaPony


8
누군가이 것을 중복으로 표시해야합니다.
Ivan

8
@Ivan : 이것은 지금까지 네 번째 질문입니다 ...
Nikolas

1
@ 니콜라스 : 그렇습니다. 오늘 여기에서 추적되었습니다.
6

답변:


447

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

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

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

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

123

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


83

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

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

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

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

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


80

왜 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;
}

5
이것이 문제를 해결하지 않습니까? 5000OP 문제가 아닌 OP 문제가 100있습니까?
jww

62

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

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

58

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

.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);

57

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


50

불투명도 속성은 두 유형이다 :

double trans = trackBar1.Value / 5000.0;
this.Opacity = trans;

또는 간단히 :

this.Opacity = trackBar1.Value / 5000.0;

또는:

this.Opacity = trackBar1.Value / 5000d;

정수 이기 때문에 5000.0(또는 5000d)를 사용하여 이중 나누기를 강제하고 trackBar1.Value정수 나누기를 수행하고 결과는 정수가됩니다.



47

WinForms를 사용한다고 가정 Form.Opacity하고 유형 double이이므로 다음을 사용해야합니다.

double trans = trackBar1.Value / 5000.0;
this.Opacity = trans;

다른 곳에 값이 필요하지 않으면 작성하는 것이 더 간단합니다.

this.Opacity = trackBar1.Value / 5000.0;

코드를 단순히 두 배로 변경했을 때 컨트롤이 작동하지 않는 이유는 다음과 같습니다.

double trans = trackbar1.Value / 5000;

어떤는 해석 5000정수로하고 있기 때문에 trackbar1.Value또한 당신의 정수 trans값은 항상 0이다. .0컴파일러 를 추가하여 숫자를 부동 소수점 값으로 명시 적으로 지정하면 이제 컴파일러는이를 double로 해석하고 적절한 계산을 수행 할 수 있습니다.


41

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

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

41

Opacitydouble 값 이므로 처음부터 double을 사용하고 전혀 캐스트하지는 않지만 나누는 경우 double을 사용하여 정밀도를 잃지 않도록하십시오.

Opacity = trackBar1.Value / 5000.0;


0

이 시도:

Opacity = decimal.ToDouble(trackBar1.Value / 5000.0);```
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.