2010-04-09 4 views
1

누구나 내가 왜 다음 결과를 얻고 있는지 설명 할 수 있습니까?System.Decimal 라운드 지정

Dim badDecimal As Decimal = 54.50327999999999 
Dim expectedDecimal As Decimal = CDec("54.50327999999999") 

badDecimal = 54.50328D, expectedDecimal = 54.50327999999999D있다. 나의 이해는 badDecimal이 expectedDecimal 값을 포함해야한다는 것이다 (expectedDecimal이 올바른 값을 담을 수 있다는 사실은 Decimal 타입이 값을 유지하는 정밀도를 가짐을 의미한다).

미리 도움을 주셔서 감사합니다.

+1

나는 모든 그렇게 많은 VB.NET 모르겠지만, C#에서 당신은 것을 나타 내기 위해 M 문자와 숫자 접미사 필요 십진수이며, 그렇지 않으면 double입니다. 그래서 VB에서 같은 작업을 수행해야합니까? 사실, 첫 번째 라인은 이중 값 (54.50327999999999의 두 번째 해석)을 소수점으로 할당하므로 컴파일 시간에 이미 정밀도가 손실 되었습니까? –

+0

당신은 아름다운 사람이었습니다. 그것은 정말로 문제였습니다! 나는 var를 Decimal 타입으로 선언 했으므로 컴파일러에서 추측 할 것이라고 생각했습니다. 그 대답을 다시 게시하여 솔로 션으로 표시 할 수 있습니까? – WiseGuyEh

+0

답글로 Reposted comment : http://stackoverflow.com/questions/2606610/system-decimal-rounds-on-assignment/2606685#2606685 –

답변

6

이 페이지에 따르면 Decimal Data Type (Visual Basic), 그렇지 않으면 컴파일러가 Integer, Long, Double 등과 같은 적절한하지만 서로 다른 숫자 형식으로 컴파일하려고합니다, 대문자 문자 D와 소수점 리터럴 값을 접미사 필요 . 사용되는 상수 값에 따라. 귀하의 경우에는

이 코드는 기본적으로 컴파일러에 다음과 같습니다 따라서

Dim badDecimal As Decimal = (constant of type System.Double) 

그리고 이미 컴파일시 상수 값의 정밀도를 잃었다.

단순히이에 코드를 변경합니다

Dim badDecimal As Decimal = 54.50327999999999D 
              ^
              +-- add this 

및 예상대로 작동합니다.

그러나 두 변수가 동일하다고 생각하면 지치지 만 StackOverflow에 부동 소수점 유형의 "문제"에 관한 충분한 질문이있어 최소한 N 번째 십진수로 사소한 차이가 있음을 알려줍니다. , 디스플레이 나 디버거에는 적합하지 않을 정도로 작지만 두 변수를 서로 다르게 비교할 수있을만큼 충분히 작습니다.

비교할 생각이라면 일반적인 방법은 다른 하나의 값을 빼서 절대 값을 취한 다음이를 작은 값과 비교하여 " 그러나 더 크지는 않다. "

즉. 같은 :

대신이의
If Math.Abs(badDecimal - expectedDecimal) < 0.000001 Then 

는 :

If badDecimal = expectedDecimal Then 
+0

"If Math.Abs ​​..."문을 쓰지 않으면 미리 사과드립니다. 내가 원래 주석에서 말했듯이 상자에서 컴파일하지 않아도 VB.NET에 능통하지는 않습니다. –

+0

일반적인 부동 소수점의 부동 소수점 유형으로 '십진수'수가 확실하지 않습니다! = 실수 문제. (그러나 문제는 여기에 있습니다 : 십진수를 두 배로 지정하면 반올림이 발생합니다.) – Richard

+0

조언을 주셔서 감사합니다. – WiseGuyEh