- 数值变成指数形式
有时候直接使用服务端返回的数值,如余额等大额数值,哪怕是用String来接收,也会自动变成指数形式显示,还是需要使用DecimalFormat来对数字格式化一下。
public static String format_2(double d) {
DecimalFormat df = new DecimalFormat("0.00");
df.setRoundingMode(RoundingMode.HALF_UP);
return df.format(d);
}
- float和double计算精度丢失问题
使用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 应该写成 int mid = low + (high - low) / 2,因为low + high可能会溢出; -
虚拟币兑换问题
// 服务端返回了一个coinExchangeRate = 0.01来表示虚拟币比例,比例为100:1(元)
// 一开始也没做什么处理,本身这个比例就是1个代表1分,也没啥问题
// 突然有天老板觉得比例太高了,要求在其他条件不变得情况下把比例改成1000:1
// 这样个位数上的虚拟币对应的其实就是厘,厘是不做处理的所以会显示成:
// 1005个虚拟币抵扣1.00元或者1005个虚拟币抵扣1.01元,其实是对不上的
// 只能再做下处理,一般来说rmb单位最小兼容到分
// 计算多少个虚拟币表示1分,如果小于1,则表示最小单个虚拟币即大于1分,不需要处理
int danwei = (int) (1 / (100 * coinExchangeRate));
// 实际使用的虚拟币个数,去掉不到分的部分
if (danwei > 0)
mIntCoinCnt = mIntCoinCnt / danwei * danwei;
// 实际虚拟币代扣金额
mCoinAmount = mIntCoinCnt * coinExchangeRate;
网友评论