iOS開發 Objective C精確的貨幣計算

2021-06-29 15:49:18 字數 1866 閱讀 2843

在ios開發中,和貨幣**計算相關的,需要注意計算精度的問題。即使只是兩位小數,也會出現誤差。使用float型別運算,是完全不夠的。經過一番測試,最後選擇使用系統提供的api的nsdecimalnumber來進行更好的解決。

作為乙個對外的庫,鑑於版本延續,我們保留對外的flaot的型別,不改變介面,選擇進行內部適配。

以下是一些基本的測試,

原始資料

float a = 0.01;

int b = 99999999;

double c = 0.0;

1:使用浮點運算,

c = a*b;

nslog(@"%f",c);

nslog(@"%.2f",c);

使用double型別儲存沒有觸及問題的實質,完全不能解決。

2011-12-30 11:04:00.121 untitled[2912:207] 1000000.000000

2011-12-30 11:04:00.123 untitled[2912:207] 1000000.00

2:使用型別轉換,提高精度

c = a*(double)b;

nslog(@"%f",c);

nslog(@"%.2f",c);

double運算的精度是提高了,可是浮點數的數值早已經出現了精度的不準確,即使儲存空間足夠,同樣還是不準確的數值。

2011-12-30 11:04:00.123 untitled[2912:207] 999999.967648

2011-12-30 11:04:00.124 untitled[2912:207] 999999.97

3:通過和nsstring的轉換,將計算的原始資料轉換為純粹的double型別的資料,這樣的計算精度就可以達到要求了。

nsstring *obja = [nsstring stringwithformat:@"%.2f", a];

nsstring *objb = [nsstring stringwithformat:@"%.2f", (double)b];

c = [obja doublevalue] * [objb doublevalue];

nslog(@"%.2f",c);

計算的結果還是比較準確的,不過需要做格式化輸入和格式化輸出的處理。同時使用nsstring來轉換,這樣的寫法看起來比較奇怪。

2011-12-30 11:04:00.190 untitled[2912:207] 999999.99

其計算的精度是比較高,這是官方建議的貨幣計算的api,對乘除等計算都有單獨的api介面來提供。

nsstring *decimalnumbermutiplywithstring(nsstring *multipliervalue,nsstring *multiplicandvalue)

nslog(@"%@",decimalnumbermutiplywithstring([nsstring stringwithformat:@"%f",a], [nsstring stringwithformat:@"%d",b]));

2011-12-30 11:04:00.251 untitled[2912:207] 999999.99

只是測試,所以介面名大致寫寫,名字取得比較不那麼講究,希望可以表達清楚。

總的來說,對於貨幣計算,應該需要注意精度的問題。同時在運算的時候,應該優先選用框架提供的api,否則,就應該使用足夠精度的型別運算,同時對自己寫的介面進行足夠的說明,要求開發者按照規範來使用。

在自己不能保證足夠準確的情況下,用適當的說明的要求來規避責任還是可以接受的。至少被人抱怨兩句總比出錯強。

IOS開發之路 Objective C 復合

今天先補充一下很有必要記住的東西.物件 d,i 整數 u 無符整形 f 浮點 雙字 x,x 二進位制整數 o 八進位制整數 zu size t p 指標 e 浮點 雙字 科學計算 g 浮點 雙字 s c 字串 s pascal字串 c 字元 c unichar lld 64位長整數 long lon...

ios開發Objective C可變引數函式

首先作為乙個coder 很多時候會遇到自己不能解決的問題需要上網查資料,而且不知道我自己水平沒能理解 還是演示demo就有問題,或者大家都沒發現的乙個問題。這裡重新按照自己的理解重新寫乙個使用oc可變引數函式的方法。本人能力有限,如果遇到錯誤或 問題,麻煩大家指出 nsarray actionuse...

iOS開發Objective C基礎之 多型

objective c語言是物件導向的高階程式語言,因此,它具有物件導向程式設計所具有的一些特性,即 封裝性 繼承性和多型性。今天介紹一下objective c中的多型性。一 什麼是多型 多型 不同物件以自己的方式響應相同的訊息的能力叫做多型。由於每個類都屬於該類的名字空間,這使得多型稱為可能。類定...