找了好多的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
注:个人领悟,不保证完全适应各种环境,使用前请测试