今天写程序,偶然发现一个问题,感觉很奇怪,请看代码:
public class FloatTest { public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("result is "+((float)1/15 + (float)1/10 + (float)1/3 + (float)1/2));
System.out.println("result is "+((float)1/2 + (float)1/3 + (float)1/10 + (float)1/15));
}}运行结果如下:
result is 1.0
result is 1.0000001我现在需要对结果进行判断,所有需要结果的精确性。
这个问题原因是什么,如何解决? 谢谢!
public class FloatTest { public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("result is "+((float)1/15 + (float)1/10 + (float)1/3 + (float)1/2));
System.out.println("result is "+((float)1/2 + (float)1/3 + (float)1/10 + (float)1/15));
}}运行结果如下:
result is 1.0
result is 1.0000001我现在需要对结果进行判断,所有需要结果的精确性。
这个问题原因是什么,如何解决? 谢谢!
除非你用专用的数值计算软件,比如Matlab之类的。
public class Test {
public static void main(String [] args){
System.out.println(10.00-9.60);
NumberFormat f=new DecimalFormat("#.##");
System.out.println(f.format(10.00-9.60));
}
}
/***
* 这是因为在计算机中浮点数有可能(注意是可能)是不准确的,它只能无限接近准确值,而不能完全精确。
* 这是由浮点数的存储规则所决定的,我们先来看0.4这个十进制小数如何转化成二进制小数,
* 使用“乘2取整,顺序排列”法,我们发现0.4不能用二进制准确的表示,在二进制世界里它是一个无限循环的小数
*
* 解决方案1:
* 使用BigDecimal
* 解决方案2:
* 使用整数,把参与运算的值扩大100倍,然后在展示时再缩小100倍
*/
class MyMath {
public static double add(double d1, double d2)
{ // 进行加法运算
BigDecimal b1 = new BigDecimal(d1);
BigDecimal b2 = new BigDecimal(d2);
return b1.add(b2).doubleValue();
}
public static double sub(double d1, double d2)
{ // 进行减法运算
BigDecimal b1 = new BigDecimal(d1);
BigDecimal b2 = new BigDecimal(d2);
return b1.subtract(b2).doubleValue();
}
public static double mul(double d1, double d2)
{ // 进行乘法运算
BigDecimal b1 = new BigDecimal(d1);
BigDecimal b2 = new BigDecimal(d2);
return b1.multiply(b2).doubleValue();
}
public static double div(double d1,
double d2,int len) {// 进行除法运算
BigDecimal b1 = new BigDecimal(d1);
BigDecimal b2 = new BigDecimal(d2);
return b1.divide(b2,len,BigDecimal.
ROUND_HALF_UP).doubleValue();
}
public static double round(double d,
int len) { // 进行四舍五入
//操作
BigDecimal b1 = new BigDecimal(d);
BigDecimal b2 = new BigDecimal(1);
// 任何一个数字除以1都是原数字
// ROUND_HALF_UP是BigDecimal的一个常量,
//表示进行四舍五入的操作
return b1.divide(b2, len,BigDecimal.
ROUND_HALF_UP).doubleValue();
}
}
public class BigDecimalDemo01 {
public static void main(String[] args) {
System.out.println("加法运算:" +
MyMath.round(MyMath.add(10.345,
3.333), 1));
System.out.println("乘法运算:" +
MyMath.round(MyMath.mul(10.345,
3.333), 3));
System.out.println("除法运算:" +
MyMath.div(10.345, 3.333, 3));
System.out.println("减法运算:" +
MyMath.round(MyMath.sub(10.345,
3.333), 3));
}
}
这个方法,但是我只要判定 1/a+1/b+1/c+1/d的结果是否恰好等于1~ 而且要循环好几千次去检测,这样时间和空间复杂度会不会增加
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("result is "+((float)1/15 + (float)1/10 + (float)1/3 + (float)1/2));
System.out.println("http://www.niuwanet.com/"));
System.out.println("result is "+((float)1/2 + (float)1/3 + (float)1/10 + (float)1/15));
}