点击查看代码
package com.bh.bugs;
import java.math.BigDecimal;
import java.math.RoundingMode;
public class Test1 {
public static void main(String[] args) {
System.out.println("start==========");
// java中, double在计算的时候,精度丢失问题
// 1, 问题再现
// 不仅仅是java语言, 包括js, 在计算浮点类型的时候
// 出现了精度丢失
double d1 = 1;
double d2 = 0.99;
// System.out.println(d1 - d2);
// 2, 问题分析
// 问题很简单, 计算机底层是二进制的,任何计算都会转换成二进制
// 然后进行计算, 计算结果会再次转换成相应的类型
// 这个时候,精度就丢失了
// 3, 问题解决
// 在java中,任何关于浮点类型的计算, 一定要使用BigDecimal这个类
// 如果你的项目是, 银行,商城,保险,金融,电信等,一定要使用BigDecmial
//BigDecimal演示
BigDecimal big1 = new BigDecimal("1");
BigDecimal big2 = new BigDecimal("0.99");
BigDecimal rst = big1.subtract(big2);
double d3 = rst.doubleValue();
// System.out.println(d3);
// 保留两位小数点, 经典的四舍五入
BigDecimal rst2 = rst.setScale(2, RoundingMode.HALF_UP);
// System.out.println(rst2);
BigDecimal big3 = new BigDecimal("11.545");
// 银行家舍入方法
// 银行家舍入
// https://baike.baidu.com/item/%E9%93%B6%E8%A1%8C%E5%AE%B6%E8%88%8D%E5%85%A5/4781630?fr=aladdin
BigDecimal rst3 = big3.setScale(2,RoundingMode.HALF_EVEN);
System.out.println(rst3);
System.out.println("end ==========");
}
}