2010-07-21 3 views

답변

2

나는 문제가 당신이 NSDecimalNumber에의 NSNumber의 -longLongValue 방법을 사용하고 있음을 믿습니다. NSDecimalNumber는 내부적으로 10 진수로 숫자의 고정밀 표현을 저장하지만 NSNumber는이를 IEEE 754 배정 밀도 부동 소수점 값으로 유지합니다. 올바르게 기억한다면 NSDecimalNumber에서 표준 NSNumber 수퍼 클래스 메서드를 사용하면 내부 숫자가 먼저 double로 변환되어이 같은 이진 부동 소수점 아티팩트가 생길 수 있습니다.

neoneye가 제안했듯이이 문제를 해결하기 위해 NSString을 중개자로 사용할 수 있습니다. 예를 들어

NSDecimalNumber* number = [NSDecimalNumber decimalNumberWithString :@"11111111111111111"]; 
double number2 = [@"11111111111111111" doubleValue]; 

NSLog(@"%@ = %lld = %f", number, [[number descriptionWithLocale:nil] longLongValue], number2); 

는 십진수 추출로부터 정확한 결과 및이 수가 일시적 번에 저장 될 때 발생하는 오차를 모두 나타내는 11111111111111111 = 11111111111111111 = 11111111111111112.000000 결과를 생성 할 것이다.

+0

"NSDecimalNumber에서 표준 NSNumber 수퍼 클래스 메서드를 사용하면 내부 번호가 먼저 double로 변환되어" 과 같은 부동 소수점 아티팩트가 생길 수 있습니다.이 정보를 어디에서 얻었습니까? 그것은 이상하게 들리며 나는 그것을 거의 믿지 않는다. 대부분의 경우 우리는 NSNumber 인터페이스를 통해 인스턴스로 작업하며이 인스턴스를 구성하는 데 사용 된 구체적인 하위 클래스를 생각해서는 안됩니다. – iKiR

+0

@iKiR - 여기에 토론이있었습니다 : http://stackoverflow.com/questions/2479100/cocoa-ive-discovered-what-i-think-is-a-bug-with-nsdecimalnumber, Marcus의 의견을 가리 킵니다. 여기에 : http://www.cimgf.com/2008/04/23/cocoa-tutorial-dont-be-lazy-with-nsdecimalnumber-like-me/하지만이 사실을 정확히 진술하지는 않습니다. 비슷한 문제가 발생했을 때 코코아 - dev 메일 목록 아카이브의 어딘가에있을 수 있습니다. 예, 이상합니다. 그때 버그 보고서를 제출했다고 생각합니다. 나는 너 자신 또 하나를 신청하는 것이 좋습니다. –

+0

Brad에게 감사드립니다. 몇 분 전에 버그를 제출했습니다. https://bugreport.apple.com/cgi-bin/WebObjects/RadarWeb.woa/3/wo/Stnn5Aaocknzx52c64zbN0/5.83.28.0.9 – iKiR