在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中的多型性。一 什麼是多型 多型 不同物件以自己的方式響應相同的訊息的能力叫做多型。由於每個類都屬於該類的名字空間,這使得多型稱為可能。類定...