金額計算精度問題

2021-07-25 20:10:45 字數 1706 閱讀 7896

首先我丟擲乙個例子**如下

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...