2011-09-14 4 views
27

왜 ColdFusion의 수학 연산은 부동 소수점 수학 문제의 영향을받는 것 같지 않습니까? equivlant 자바 코드는 두 개의 복식을 추가 할 때 나는 "기대 d는 무엇을 생산하지만왜 ColdFusion에서 0.06 + 0.01 = 0.07입니까?

result = 0.06 + 0.01; 

writedump(result); 
writedump(result.getClass().getName()); 

0.07

java.lang.Double에

을 출력합니다 코드를 가지고 :

public static void main(String[] args) { 
    double a = 0.01d; 
    double b = 0.06d; 

    System.out.println(a + b); //0.06999999999999999 
} 

이것은 부동 수학 (http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html)의 현실 때문에 ColdFusion에서 볼 수 있습니다.

ColdFusion에서 장면 뒤에서 "마법"을 수행합니까? 아니면 여기에서 격리 된 예외를보고 있습니까?

+0

Google에서 제공하는 모든 것이 CF에 특별한 것은 없으며 사용자가 기대하는 결과를 산출한다고 말합니다. 왜 사람들은 부동 소수점 정밀도를 이해하지 못하기 때문에 이유를 묻습니다. CF 코드에서 다른 일이 일어나지 않았습니까? –

+0

네, 바로 그 발췌 문장입니다. 방금 일어날 일을 볼 수있는 가장 단순한 시나리오를 만들었습니다. 내가이 코드를 한 단계 더 나아가'a = 0.01; b = 0.06; – bittersweetryan

+2

CF는 대부분의 값을 처음에는 문자열로 저장하지만 다른 유형 (숫자, 날짜, 숫자 등)으로 변환하는 경우에만 사용할 수 있습니다. 등). '+'와 같은 수학 연산자가 적용될 때와 같이 http://help.adobe.com/ko_KR/ColdFusion/9.0/Developing/WSc3ff6d0ea77859461172e0811cbec09af4-7fc3.html – Leigh

답변

35

출력이 일 때 단순히 다르게 반올림되는 것 같습니다. 즉,이 문제는 여전히 존재합니다.이 특정 값이 writedump과 함께 인쇄 될 때 표시되지 않습니다.

당신은 무엇을 사용하면 어떻게됩니까 :

writedump(String.valueOf(result)); 

?

+0

문자열의 값을 덤프하면 .69999999999999가 표시됩니다. – bittersweetryan

+3

'writedump'와'cfdump'는 서식을 많이 지정합니다. 이렇게하면 복잡한 객체를 매우 쉽게 볼 수 있지만 모양이 비슷합니다. 그것은 또한 이런 경우에 약간의 모호함을 가져온다. – Antony

+0

@Antony - 네. 나는 그것을 암묵적으로 신뢰하지 않는다는 것을 배웠다. 많은 경우 정밀도보다 판독 가능성을 선호하도록 설계되었으므로) – Leigh