- 數(shù)值變成指數(shù)形式
有時(shí)候直接使用服務(wù)端返回的數(shù)值处嫌,如余額等大額數(shù)值损俭,哪怕是用String來接收涩禀,也會(huì)自動(dòng)變成指數(shù)形式顯示,還是需要使用DecimalFormat來對(duì)數(shù)字格式化一下徘跪。
public static String format_2(double d) {
DecimalFormat df = new DecimalFormat("0.00");
df.setRoundingMode(RoundingMode.HALF_UP);
return df.format(d);
}
- float和double計(jì)算精度丟失問題
使用BigDecimal
public class ArithUtil {
private static final int DEF_DIV_SCALE=10;
private ArithUtil(){}
public static double add(double d1,double d2){
return add(Double.toString(d1), Double.toString(d2));
}
public static double add(String d1, String d2){
BigDecimal b1 = new BigDecimal(d1);
BigDecimal b2 = new BigDecimal(d2);
return b1.add(b2).doubleValue();
}
public static double sub(double d1,double d2){
return sub(Double.toString(d1), Double.toString(d2));
}
public static double sub(String d1, String d2){
BigDecimal b1 = new BigDecimal(d1);
BigDecimal b2 = new BigDecimal(d2);
return b1.subtract(b2).doubleValue();
}
public static double mul(double d1,double d2){
return mul(Double.toString(d1), Double.toString(d2));
}
public static double mul(String d1, String d2){
BigDecimal b1 = new BigDecimal(d1);
BigDecimal b2 = new BigDecimal(d2);
return b1.multiply(b2).doubleValue();
}
public static double div(double d1,double d2){
return div(d1,d2,DEF_DIV_SCALE);
}
public static double div(double d1,double d2,int scale){
return div(Double.toString(d1), Double.toString(d2), scale);
}
public static double div(String d1, String d2, int scale){
if(scale < 0){
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
BigDecimal b1=new BigDecimal(d1);
BigDecimal b2=new BigDecimal(d2);
return b1.divide(b2,scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}
}
int + int 溢出問題
int low,high,mid;
int mid = (low + high) / 2 應(yīng)該寫成 int mid = low + (high - low) / 2甘邀,因?yàn)閘ow + high可能會(huì)溢出;虛擬幣兌換問題
// 服務(wù)端返回了一個(gè)coinExchangeRate = 0.01來表示虛擬幣比例垮庐,比例為100:1(元)
// 一開始也沒做什么處理松邪,本身這個(gè)比例就是1個(gè)代表1分,也沒啥問題
// 突然有天老板覺得比例太高了哨查,要求在其他條件不變得情況下把比例改成1000:1
// 這樣個(gè)位數(shù)上的虛擬幣對(duì)應(yīng)的其實(shí)就是厘逗抑,厘是不做處理的所以會(huì)顯示成:
// 1005個(gè)虛擬幣抵扣1.00元或者1005個(gè)虛擬幣抵扣1.01元,其實(shí)是對(duì)不上的
// 只能再做下處理寒亥,一般來說rmb單位最小兼容到分
// 計(jì)算多少個(gè)虛擬幣表示1分邮府,如果小于1,則表示最小單個(gè)虛擬幣即大于1分溉奕,不需要處理
int danwei = (int) (1 / (100 * coinExchangeRate));
// 實(shí)際使用的虛擬幣個(gè)數(shù)褂傀,去掉不到分的部分
if (danwei > 0)
mIntCoinCnt = mIntCoinCnt / danwei * danwei;
// 實(shí)際虛擬幣代扣金額
mCoinAmount = mIntCoinCnt * coinExchangeRate;