標籤:
在iOS中需要精確計算時,double, float類型往往會出現不可預料的問題:
在調試過程中可以看到 doule 類型 d3 在計算過程中值不是預計的9999.99。
如果在要用中計算涉及到金額等重要資料,不建議使用這種不可控結果的方式,可以採用iOS提供的另外一種支援準確精度計算的資料類型 NSDecimalNumber.
NSDecimalNumber是NSNumber的子類,比NSNumber的功能更為強大,可以指定一個數的冪,四捨五入等操作。由於NSDecimalNumber精度較高,所以會比基礎資料型別 (Elementary Data Type)費時,所以需要權衡考慮,蘋果官方建議在貨幣以及要求精度很高的情境下使用。
所有NSDecimalNumber對象是不可變的,這意味著已經被建立後不能改變它們的值。
- (NSDecimalNumber *)decimalNumberByAdding:(NSDecimalNumber *)decimalNumber;- (NSDecimalNumber *)decimalNumberByAdding:(NSDecimalNumber *)decimalNumber withBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior;- (NSDecimalNumber *)decimalNumberBySubtracting:(NSDecimalNumber *)decimalNumber;- (NSDecimalNumber *)decimalNumberBySubtracting:(NSDecimalNumber *)decimalNumber withBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior;- (NSDecimalNumber *)decimalNumberByMultiplyingBy:(NSDecimalNumber *)decimalNumber;- (NSDecimalNumber *)decimalNumberByMultiplyingBy:(NSDecimalNumber *)decimalNumber withBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior;- (NSDecimalNumber *)decimalNumberByDividingBy:(NSDecimalNumber *)decimalNumber;- (NSDecimalNumber *)decimalNumberByDividingBy:(NSDecimalNumber *)decimalNumber withBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior;
NSDecimalNumberBehaviors對象可以通過下述方法建立
NSDecimalNumberHandler *roundUp = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundBankers scale:2 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:YES];
scale代表保留小數點後幾位
枚舉,
NSRoundPlain, // Round up on a tie //貌似取整 NSRoundDown, // Always down == truncate //只舍不入 NSRoundUp, // Always up // 只入不舍 NSRoundBankers // on a tie round so last digit is even 貌似四捨五入
Objective-C 精確計算