2016-08-24 5 views
8

Swift 앱의 특정 Doubles는 NSNumber로 변환 할 때 문제를 일으키고 일부는 그렇지 않습니다. 내 응용 프로그램은 코어 데이터를 사용하여 저장하고 검색 할 수 있도록 NSNumbers에 소수점 이하 두 자리 (가격)의 double을 변환해야합니다. 예를 들어, NSNumber의 doubleValue 메소드를 사용하여 특별히 포맷하지 않는 한 79.99와 같은 특정 가격은 99.98999999999999로 평가됩니다. 여기Swift에서 Double을 NSNumber로 변환하면 정확도가 떨어집니다.

selectedWarranty.price = 79.99 나는 이유가있는 경우 변환이

Original double: 79.99 
Converted to NSNumber: 79.98999999999999 
.doubleValue Representation: 79.99 

누군가가 설명 할 수를 작동하는 방법을 보여 일부 인쇄 문을 프로그램

// item.price: NSNumber?  
// selectedWarranty.price: Double? 

item.price = NSNumber(double: selectedWarranty.price!) 

디버거 같이 왜 이니셜 라이저는 모든 숫자에 대해 소수점 2 자리를 확실히 유지할 수 없습니까? 코어 데이터에 반드시 가격을 저장하고 싶습니다. 표시 될 때마다 서식을 지정하는 것이 매우 편리하지 않습니다.

UPDATE : 데이터 모델을 통해 NSDecimalNumber를 입력 할 수 변환 코어 데이터 객체, 79.99 및 99.99 더 이상 문제가 있지만, 다른 번호로 지금보다 관리 문제 ... 첫째

Original double: 39.99 
Converted to NSDecimalNumber: 39.99000000000001024 
+1

[최소, 완전하고 검증 가능한 예] (http://stackoverflow.com/help/mcve)를 만드실 수 있습니까? – Alexander

+1

통화에 'NSNumber' 대신'NSDecimalNumber'를 사용하십시오. – rmaddy

+0

이 문제는 재현 할 수 없습니다. http://swiftlang.ng.bluemix.net/#/repl/57bdc2590dcf4abf47da28c2 – Alexander

답변

9

, 당신 ' 일부 용어를 혼란스럽게합니다. 79.9899999999999979.99보다 정밀도가 높지만 (소수점 이하 자릿수 확장이 길지만) 정확도는 낮습니다 (실제 값에서 벗어남).

두 번째로 NSNumber는 79.9979.98999999999999도 저장하지 않습니다. IEEE 754 표준에 따라 값의 크기를 저장합니다. 여러분이보고있는 것은 그 크기를 사람이 읽을 수있는 숫자로 변환하는 데 적용되는 인쇄 논리의 결과 일 가능성이 큽니다. 어떤 경우 든 고정 된 정밀도로 값을 저장하려면 Float 또는 Double을 사용해서는 안됩니다. 본질적으로 표현 가능한 값의 범위를 늘리기 위해 정밀도를 희생합니다.

Int 센트 또는 NSDecimalNumber으로 가격을 나타내는 것이 훨씬 낫습니다.

사방 어떻게 두 작품의 Why not use Double or Float to represent currency?

+0

감사합니다. NSDecimalNumber 경로가 가장 적합합니다. 내 유일한 질문은 코어 데이터 모델을 NSNumber 대신 사용할 수 있도록하는 방법입니다. 나는이 분야에서 경험이 많지 않다. – joelrorseth

+0

나는 그것을위한 새로운 질문을 열어 보라. 이 답변이 귀하의 즉각적인 질문을 만족 시킨다면, 그것을 인정 된 것으로 표시하십시오 :) – Alexander

1

를 참조하십시오. 소수점 2 자리 만 필요하면 두 번째 자리 뒤에 점을 추가하는 대신 정수/길이를 사용하여 값을 표시해야합니다.

관련 문제