double的四舍五入

找了好多的double四舍五入,但好多都是舍弃,计0.005保留两位小数不是0.01而是0.00,计实现原理是直接舍弃后面的小数了。。。。。

下面是自己写的,不过可能由于环境问题,需要改动。

原理很简单,double精度问题,如 double存0.1*0.1时输出你会发现是这个数:0.010000000000000002  (最后一位是误差但误差多少没研究过,有兴趣在看看底层存储吧)

所以0.01==a    会是false,其中(a=0.1*0.1) 

即   double  类型不能直接(如:ra>0.05)比较大小(但一般情况下只要保证两个数不相等还是可以比较大小滴(0.01000001还是大于0.010000000000000002 的),大笑

所有四舍五入也有思路了,

如保留两位小数:

>0.005    0.01+ X     X为在原数值舍弃两位小数后的基础上(即从第3位小数后都不要,一会再说这个问题)

=0.005    0.01+ X

<0.005    0.00+ X

这样就能保证处理过的数为真正的保留两位小数了。

比较大小都可以,那怎么判断相等呢? 这里我用了一个近似,

0.005-a<0.0000000001  (即1e-10) 就认为相等

再说怎么得到X

我的方法是利用格式转换,double转int时会舍弃小数,所有,(int)(0.019*100)为0.01 在*0.1变为小数即可

下面是我的代码:

/**
	 * 
	* @Title: doubletofort 
	* @Description: TODO(double四舍五入函数) 
	* @param d 传入数值
	* @param i 保留位数  0<i<10
	* @return  double
	* @throws
	 */
	public static double doubletofort (double d, int i){
		double dot=1;
		int dint=1;
		for (int j = 0; j < i; j++) {dint*=10;}
		for (int j = 0; j < i; j++) { dot*=0.1;}
		if(0.5*dot-(  d- (int)(d*dint)/(dint*1.0)) >1e-10)  //4设5入  这里相等时会小于1e-10,会执行else
			d=(int)(d*dint)/(dint*1.0);//保留i位小数
		else 
			d=(int)(d*dint)/(dint*1.0)+dot;
		return d;
	}
	public static void main(String[] args) {  //测试函数
		double d=doubletofort(6.0049,2);
		System.out.println(d);
		 d=doubletofort(6.0050,2);
		System.out.println(d);
		 d=doubletofort(6.0051,2);
		System.out.println(d);
		d=0.1*0.1;
		System.out.println(d);
	}

测试结果:

6.0
6.01
6.01
0.010000000000000002


注:个人领悟,不保证完全适应各种环境,使用前请测试


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值