展开全部
这是为什么呢?//double类型62616964757a686964616fe58685e5aeb931333337626131直接转换成为BigDecimal还是会造成精度丢失
解决方案//把double类型首先转换为String类型, 然后再把String类型转换成BigDecimal类型
实例代码import java.math.BigDecimal;
public class B {
public static void main(String[] args) {
print0();
print1();
print2();
print3();// 解决方案
}
private static void print0() {
double d = 12345.15;
BigDecimal b = new BigDecimal(d);
System.out.println(b);
double d1 = b.setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue();
System.out.println(d1);
}
private static void print1() {
double d = 1234.115;
BigDecimal b = new BigDecimal(d);
System.out.println(b);
double d1 = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
System.out.println(d1);
}
private static void print2() {
double d = 2345.115;
BigDecimal b = new BigDecimal(d);
System.out.println(b);
double d1 = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
System.out.println(d1);
}
private static void print3() {
double d = 2345.115;
BigDecimal b = new BigDecimal(String.valueOf(d));//方案一
//BigDecimal b = new BigDecimal("2345.115");//方案二
//BigDecimal b = new BigDecimal(""+d);//方案三
System.out.println(d);
double d1 = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
System.out.println(d1);
}
}
输出12345.149999999999636202119290828704833984375
12345.1 //四舍五入 保留1位
1234.115000000000009094947017729282379150390625
1234.12 //四舍五入 保留2位
2345.114999999999781721271574497222900390625
2345.11 //四舍五入 保留2位
2345.115
2345.12 //四舍五入 保留2位