java 浮点数转整数精度处理

System.out.println("------case1------");
BigDecimal bigDecimal = new BigDecimal(37.98);
System.out.println(bigDecimal);     //37.97999999999999687361196265555918216705322265625
System.out.println(bigDecimal.intValue()); //37

System.out.println("------case2------");
int totalAmount = (int) (37.98 * 100);  
System.out.println(totalAmount);        //3797

System.out.println("------case3------");
totalAmount = new BigDecimal(37.98 * 100).intValue();
System.out.println(totalAmount);    //3797

System.out.println("------case4------");
System.out.println(bigDecimal.movePointRight(2));       //3797.999999999999687361196265555918216705322265625
System.out.println(bigDecimal.movePointRight(2).intValue()); //3797

System.out.println("------case5------");
System.out.println(new BigDecimal(37).intValueExact()); //没有异常,没有小数点被截取 37
//System.out.println(bigDecimal.intValueExact());             //存在异常,小数点精度丢失

System.out.println("------case6------");
System.out.println(bigDecimal.multiply(new BigDecimal(100)));   //3797.99999999999968736119626555591821670532226562500
System.out.println(bigDecimal.multiply(new BigDecimal(100)).intValue()); //3797

//正确处理
System.out.println("------case7------");
System.out.println(new BigDecimal(37.9899).setScale(2, BigDecimal.ROUND_HALF_UP));   //保留两位小数,后面小数上取整 37.99
System.out.println(bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)).intValue()); //3798
System.out.println(Math.ceil(37.98 * 100));        //37.98 * 100 = 3797.9999999999995
System.out.println((int) Math.ceil(37.98 * 100)); //3798

------case1------
37.97999999999999687361196265555918216705322265625
37
------case2------
3797
------case3------
3797
------case4------
3797.999999999999687361196265555918216705322265625
3797
------case5------
37
------case6------
3797.99999999999968736119626555591821670532226562500
3797
------case7------
37.99
3798
3797.9999999999995
3798.0
3798
 

猜你喜欢

转载自my.oschina.net/u/2552286/blog/2962535