NSDecimalNumber - 精確的數值計算

浮點數計算會存在誤差
float:6-7位有效數
double:15-16位有效數
decimal:不是基礎數據類型,精確度非常高具體也不是很了解,一般用作貨幣計算時使用。精度高對應的消耗也大。

創建 NSDecimalNumber

[NSDecimalNumber zero] // 0
[NSDecimalNumber one] // 1
[NSDecimalNumber minimumDecimalNumber] // 超級小
[NSDecimalNumber maximumDecimalNumber] // 超級大
[NSDecimalNumber notANumber] // NaN

// 字符串 獲取
[NSDecimalNumber decimalNumberWithString:@"a111.111aa'11.11"] // 只獲取一個小數點,或者 NaN

// NSNumber 獲取
NSNumber *number1 = @12.456789;
NSDecimal decimal = [number1 decimalValue];
NSDecimalNumber *decimal2 = [[NSDecimalNumber alloc] initWithDecimal:decimal];
    


計算

注意計算要直接使用下面的方法,不要先轉換成double 或者其他計算。

    NSDecimalNumber *add = [decimal1 decimalNumberByAdding:decimal2];// 加
    NSDecimalNumber *substract = [decimal1 decimalNumberBySubtracting:decimal2];// 減
    NSDecimalNumber *multiply = [decimal1 decimalNumberByMultiplyingBy:decimal2];// 乘
    NSDecimalNumber *divid = [decimal1 decimalNumberByDividingBy:decimal2];// 除
    NSDecimalNumber *rais = [decimal1 decimalNumberByRaisingToPower:3];// decimal1 的 power次方
    NSDecimalNumber *multiplyPower10 = [decimal1 decimalNumberByMultiplyingByPowerOf10:3];// decimal1 乘 10 的 power次方

調整有效位數

    // 有效數調整:scale:小數位數。 其他參數:都是異常處理 YES 返回異常! NO 忽略
    NSDecimalNumberHandler *hander = [[NSDecimalNumberHandler alloc] initWithRoundingMode:NSRoundPlain
                                                                                    scale:2
                                                                         raiseOnExactness:NO
                                                                          raiseOnOverflow:NO
                                                                         raiseOnUnderflow:NO
                                                                      raiseOnDivideByZero:YES];

// 例如 計算是就處理
    NSDecimalNumber *aaaa = [decimal1 decimalNumberByMultiplyingBy:decimal2 withBehavior:hander];

// 或者 直接處理
    NSDecimalNumber *decimal3 = [decimal1 decimalNumberByRoundingAccordingToBehavior:hander];

轉換

    NSDecimal newDecimal = [decimal1 decimalValue];
    NSString *newString = [decimal1 stringValue];
    double newDouble = [decimal1 doubleValue];

NSDecimal 類

其他

1

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容