Objective-C 精確計(jì)算

在iOS中需要精確計(jì)算時(shí),double, float類型往往會出現(xiàn)不可預(yù)料的問題:



  在調(diào)試過程中可以看到 doule 類型 d3 在計(jì)算過程中值不是預(yù)計(jì)的9999.99。

如果在要用中計(jì)算涉及到金額等重要數(shù)據(jù),不建議使用這種不可控結(jié)果的方式,可以采用iOS提供的另外一種支持準(zhǔn)確精度計(jì)算的數(shù)據(jù)類型 NSDecimalNumber.
  NSDecimalNumber是NSNumber的子類,比NSNumber的功能更為強(qiáng)大,可以指定一個(gè)數(shù)的冪,四舍五入等操作。由于NSDecimalNumber精度較高,所以會比基本數(shù)據(jù)類型費(fèi)時(shí),所以需要權(quán)衡考慮,蘋果官方建議在貨幣以及要求精度很高的場景下使用。

所有NSDecimalNumber對象是不可變的,這意味著已經(jīng)被創(chuàng)建后不能改變它們的值。

- (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對象可以通過下述方法創(chuàng)建

NSDecimalNumberHandler *roundUp = [NSDecimalNumberHandler
                                       decimalNumberHandlerWithRoundingMode:NSRoundBankers
                                       scale:2
                                       raiseOnExactness:NO
                                       raiseOnOverflow:NO
                                       raiseOnUnderflow:NO
                                       raiseOnDivideByZero:YES];

scale代表保留小數(shù)點(diǎn)后幾位
  枚舉:

NSRoundPlain,   // Round up on a tie //貌似取整
NSRoundDown,    // Always down == truncate  //只舍不入
NSRoundUp,      // Always up    // 只入不舍
NSRoundBankers  // on a tie round so last digit is even  貌似四舍五入
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容