java小数点精度的问题

                            小数点的精度问题,四舍五入

在做公司的支付系统的时候,遇到了一个很小的问题,但是前后改了很多次,就是钱的精度问题。要求是保留2位小数,也就是精确到人民币的“分”。下面就是我的改bug 的痛苦经历,直接帖出代码
 

package com.msds;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;



public class test {
	public static void main(String[] args) {
		
//		//第一种bug
//		Double a=new Double("209");
//		Double b=a*0.0065;
//		BigDecimal c = new BigDecimal(b);
//		Double d=c.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); //四舍五入保留2位小数
//		String transFee=d.toString();
//		transFee = String.format("%.2f",d);
		
//		//第二次bug
//    	Double a = new Double(576);
//    	Double b = a*0.0065;
//    	Double c = (double)Math.round(b*100)/100;
//    	String transFee = c.toString();	
//    	
//    	//第三次bug
//    	BigDecimal a = new BigDecimal(576);
//    	BigDecimal b = a.multiply(new BigDecimal(0.0065));	//交易费率0.0065
//    	BigDecimal c = b.setScale(2, RoundingMode.UP);
//    	String transFee = c.toString();	
//		
//		//第四次-bug
//    	String orderAmt="576";
//    	double a=Double.parseDouble(orderAmt);
//    	double b=a*0.0065;  //交易费率0.0065
//      double c = round(b,2);
//      String transFee = String.valueOf(c);
		
		//第五次-bug
		double a=370;
		double b=a*0.0065;
		double c=a*0.0065;
		String d = String.format("%.2f", c);
        
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
        System.out.println(d);
	}
	
	private static double round(double num,int scale) {
		return Math.round(num * Math.pow(10, scale)) / Math.pow(10, scale);
	}
}

,上面的前4 种方式,都会出现问题,结果并不是,想要的保留两位小数后,四舍五入的数值。只有最后一种方式,没有出现问题。记录下。

比如,方法3 中,结果会是这样的,我们想得到3.74,结果却得到了 3.75。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值