java金额计算归整
程序员文章站
2024-02-11 21:29:04
...
背景
在项目开发中,经常遇到关于金额的计算,下单逻辑中,账务报表中等等一系列和金额相关的业务都会存在。当前的经济社会,最让人敏感的也莫过于这些金额数字,如果这些地方出问题,带来的后果可想而知。
君欲善其事必先利其器,作为一个开发人员,一定要经常性的创建与收集一些可靠的工具来帮助我们~
目的
分享与整理,望曾经在此处跌倒过的人共勉
方式
千里之堤溃于蚁泬,一个工具类的整理,虽然简单,确能保证系统中关于金额的准确性与有效性
直接上代码
/**
* 两个double类型的数值相加
*/
public static double add(double v1, double v2) {
BigDecimal b1 = BigDecimal.valueOf(v1);
BigDecimal b2 = BigDecimal.valueOf(v2);
return b1.add(b2).doubleValue();
}
/**
* 两个String类型的数值相加
*/
public static String add(String v1, String v2){
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.add(b2).toString();
}
/**
* 相减
*/
public static double sub(double v1, double v2) {
BigDecimal b1 = BigDecimal.valueOf(v1);
BigDecimal b2 = BigDecimal.valueOf(v2);
return b1.subtract(b2).doubleValue();
}
/**
* 相减
*/
public static double sub(String v1, String v2) {
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.subtract(b2).doubleValue();
}
/**
* 相乘,此处默认保留两位小数
* 并使用四舍五入原则取值
*/
public static double mul(double v1, double v2) {
BigDecimal b1 = BigDecimal.valueOf(v1);
BigDecimal b2 = BigDecimal.valueOf(v2);
return b1.multiply(b2).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
}
/**
* 相除,此处默认保留两位小数
* 并使用四舍五入原则取值
*/
public static double div(double v1, double v2) {
BigDecimal b1 = BigDecimal.valueOf(v1);
BigDecimal b2 = BigDecimal.valueOf(v2);
return b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP).doubleValue();
}
/**
* 将dubbo类型转为string类型
* 格式化金额,统一保留2位小数
*/
public static String formatAmount(Double amount){
NumberFormat nf = NumberFormat.getInstance();
//设置最大保留小数位数
nf.setMaximumFractionDigits(2);
//取消','等计数方式
nf.setGroupingUsed(false);
return nf.format(amount);
}
后话与注意
1、代码中对于金额的计算尽量避免使用+,-,*,/这些操作,要用上述工具方法进行替代
2、此处整理并非全面,每个人都有自己的使用习惯,在此只做提笔,不敢妄言指教
3、JDK官方已经不再建议使用new Bigdecimal(double v)这种方式的构造方法,尽量使用string类型传值
而BigDecimal.valueOf(v1)的源码即:
因而都使用了此方式
4、文中若错误及不当之处,望指教与提醒,十分感激。
5、多整理,多总结,希望我们都能超神
上一篇: 递归算法介绍及Java应用实战
下一篇: 【递归】算法题整理(持更)