在iOS中需要精確計(jì)算時(shí),double, float類(lèi)型往往會(huì)出現(xiàn)不可預(yù)料的問(wèn)題:
在調(diào)試過(guò)程中可以看到 doule 類(lèi)型 d3 在計(jì)算過(guò)程中值不是預(yù)計(jì)的9999.99航瞭。
如果在要用中計(jì)算涉及到金額等重要數(shù)據(jù)网持,不建議使用這種不可控結(jié)果的方式野蝇,可以采用iOS提供的另外一種支持準(zhǔn)確精度計(jì)算的數(shù)據(jù)類(lèi)型 NSDecimalNumber.
NSDecimalNumber是NSNumber的子類(lèi)返劲,比NSNumber的功能更為強(qiáng)大唉窃,可以指定一個(gè)數(shù)的冪剪菱,四舍五入等操作摩瞎。由于NSDecimalNumber精度較高,所以會(huì)比基本數(shù)據(jù)類(lèi)型費(fèi)時(shí)孝常,所以需要權(quán)衡考慮旗们,蘋(píng)果官方建議在貨幣以及要求精度很高的場(chǎng)景下使用。
所有NSDecimalNumber對(duì)象是不可變的构灸,這意味著已經(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對(duì)象可以通過(guò)下述方法創(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 貌似四舍五入