在项目中, 关于交易的时候, 我们自己对金额做了处理, 但是与第三方进行交互, 不是第三方要的金额形式, 第三方要的是: 元并且保留两位小数 ,下面是一个小列子
/** * @desc 缴费金额(单位:元) */ private Long Pay_amount; //A类里面有一个属性
A a = new A(); //创建对象
//比如说lrPaymentItem.getPay_amount()=500000 精确到厘,但是别人要的是元,并且要两位小时,就除10000 ,除完了等于50元
BigDecimal amount = new BigDecimal(a.getPay_amount()).divide(new BigDecimal("10000"));
//保留2位小数, 最后是50.00 元
String totalFee = new DecimalFormat("0.00").format(amount); map.put("totalFee", String.valueOf(totalFee)); //保留2位小数, 最后是50.00 元
eg2: 处理类型转换之前发生的问题, 如下: double转long类型, 进行了四舍五入!!!!丢失了原来的参数.
import java.math.BigDecimal; public class demo { public static void main(String[] args) { Double valueOf = Double.valueOf(1.25); System.out.println(valueOf); // 1.25 System.out.println(valueOf.longValue() * 10000); // 结果是10000 , Double转换 long的时候, 发生了错误.会进行转移的. BigDecimal amount = new BigDecimal(1.25); // 用了BigDecimal类来处理 System.out.println(amount); // 1.25 BigDecimal amount3 = new BigDecimal(valueOf).multiply(new BigDecimal("10000")); // 用了BigDecimal类来处理 System.out.println(amount3); // 12500.00 int a = amount3.intValue(); // 用 intValue 和 longValue 方法, 把小数点后面2个0给去掉 long b = amount3.longValue(); System.out.println("--------------" + a); System.out.println("______________" + b); } }
控制台打印结果:
1.25
10000
1.25
12500.00
--------------12500
______________12500
补充, 对月案例2, 在运行的过程中发生了错误, 原因就是 BigDecimal 对 double 接收进行了精度丢失.
解决方案,
1.先把double类型, 转成String类型.
2.然后将String类型转换成BigDecimal接收, 这样不会丢失精度. 如下
Double valueOf = Double.valueOf(refund_Apply.getRefund_amount()); //refund_Apply.getRefund_amount() 是String类型
Double valueOf1 = valueOf.doubleValue() * 10000; // 计算 ,在原来的价格上 *10000
String valueOf2 = Double.valueOf(valueOf1).toString(); //转成String类型 , 但是有 .0
BigDecimal money = new BigDecimal(valueOf2); //用 BigDecimal接收, 就是为了要去掉小数点后面的 .0
long refund_money = money.longValue();
logger.info("____refund_money: {}", refund_money);
贵在积累~~~~~~