首先我丟擲乙個例子**如下
nsstring *str = @"555448.96";
float vlue = str.floatvalue;
double vlue2 = str.doublevalue;
nsstring *rmb = [nsstring stringwithformat:@"%.2f",vlue];
nsstring *rmbeee = [nsstring stringwithformat:@"%.2f",vlue2];
nsstring *rmb1 = [nsstring stringwithformat:@"%.2f",0.123];
nsstring *rmb2 = [nsstring stringwithformat:@"%.2f",0.124];
nsstring *rmb3 = [nsstring stringwithformat:@"%.2f",0.1251];
nsstring *rmb4 = [nsstring stringwithformat:@"%.2f",0.126];
nsstring *rmb5 = [nsstring stringwithformat:@"%.2f",0.127];
結果
我們發現vlue的精度不夠,如果用於銀行結算會出大問題,同樣float和double都是不能使用的
//由字串進行初始化
nsdecimalnumber * a = [nsdecimalnumber decimalnumberwithstring:@"555448.96"];
// 由unsigned long long型別進行初始化,exponent為位數,isnegative為是否為負數.
nsdecimalnumber* b= [nsdecimalnumber decimalnumberwithmantissa:234445460 exponent:-4 isnegative:no];
//加減乘除操作:
a = [a decimalnumberbyadding:b];
a = [a decimalnumberbysubtracting:b];//減為 a-b
a = [a decimalnumberbymultiplyingby:b];
a = [a decimalnumberbydividingby:b];//除為 a / b
// n次 冪操作
a = [a decimalnumberbyraisingtopower:2];
//比較操作,返回乙個nscomparisonresult型別的列舉,即以-1為小於,1為大於,0為相等.
typedef ns_enum(nsinteger, nscomparisonresult) result;
nslog(@"%ld",(long)[a compare:b]);
[a compare:b]; //進行比較.需要注意的是,compare函式的引數是 nsnumber,所以,要比較其他數值也就比較簡單,如要與基礎型別進行比較:
[a compare: @1];//nsnumber可以用@進行初始化.
所以在進行金額計算時盡量避免使用
float或
double,若要使用一定要精確計算
c 數值計算精度問題
採用double型資料來計算測量資料,有時似乎精度不夠,必須採用decimal,關於c 進行測繪計算時的問題 1 進行減法運算時,精度不夠。例如 double a1 648838.95 double a2 648000.0 double a3 a1 a2 a3結果理論應該為 838.95,而實際c ...
js計算精度
1 2 解決兩個數相加精度丟失問題 3 param a 4 param b 5 returns 6 7function floatadd a,b 10if undefined b null b b isnan b 11try catch f 16try catch f 21 e math.pow 1...
Assert計算精度
計算機其實是不認識十進位制數,它只認識二進位制數,也就是說,當我們以十進位制數進行運算的時候,計算機需要將各個十進位制數轉換成二進位制數,然後進行二進位制間的計算。如進行浮點數金額計算時會出現如下錯誤 class testadd def test add 01 self assert 0.1 0.2...