java float double类型做小数点加减运算不准确
2015-05-05 20:31
375 查看
比如: 21.1-17 不是等于4.1
解决办法================== http://blog.javaxxz.com/?p=763
一提到Java里面的商业计算,我们都知道不能用float和double,因为他们无法 进行精确计算。但是Java的设计者给编程人员提供了一个很有用的类BigDecimal,他可以完善float和double类无法进行精确计算的缺 憾。BigDecimal类位于java.maths类包下。首先我们来看下如何构造一个BigDecimal对象。它的构造函数很多,我挑最常用的两个 来演示一下:一个就是BigDecimal(double val),另一个就是BigDecimal(String
str)。
下面是两个浮点数相减的例子来说明:
public static void main(String[] args) {
double a = 1;
double b = 0.9;
BigDecimal a1 = new BigDecimal(Double.toString(a));
BigDecimal b1 = new BigDecimal(Double.toString(b));
BigDecimal a2 = new BigDecimal(a);
BigDecimal b2 = new BigDecimal(b);
double c = a1.subtract(b1).doubleValue();
double d = a2.subtract(b2).doubleValue();
System.out.println(“c=”+c);
System.out.println(“d=”+d);
}
结果为:
c=0.1
d=0.09999999999999998
可以得出结论:
利用double作为参数的构造函数,无法精确构造一个BigDecimal对象,需要自己指定一个上下文的环境,也就是指定精确位。而利用String对象作为参数传入的构造函数能精确的构造出一个BigDecimal对象。
之注:附上所有运算法则的API
加 a1.add(b1).doubleValue(); //即是 a1+b1
减 a1.subtract(b1).doubleValue() //即是a1-b1
乘 a1.multiply(b1).doubleValue() //即是a1*b1
除 a1.divide(b1).doubleValue() //即是a1/b1
解决办法================== http://blog.javaxxz.com/?p=763
一提到Java里面的商业计算,我们都知道不能用float和double,因为他们无法 进行精确计算。但是Java的设计者给编程人员提供了一个很有用的类BigDecimal,他可以完善float和double类无法进行精确计算的缺 憾。BigDecimal类位于java.maths类包下。首先我们来看下如何构造一个BigDecimal对象。它的构造函数很多,我挑最常用的两个 来演示一下:一个就是BigDecimal(double val),另一个就是BigDecimal(String
str)。
下面是两个浮点数相减的例子来说明:
public static void main(String[] args) {
double a = 1;
double b = 0.9;
BigDecimal a1 = new BigDecimal(Double.toString(a));
BigDecimal b1 = new BigDecimal(Double.toString(b));
BigDecimal a2 = new BigDecimal(a);
BigDecimal b2 = new BigDecimal(b);
double c = a1.subtract(b1).doubleValue();
double d = a2.subtract(b2).doubleValue();
System.out.println(“c=”+c);
System.out.println(“d=”+d);
}
结果为:
c=0.1
d=0.09999999999999998
可以得出结论:
利用double作为参数的构造函数,无法精确构造一个BigDecimal对象,需要自己指定一个上下文的环境,也就是指定精确位。而利用String对象作为参数传入的构造函数能精确的构造出一个BigDecimal对象。
之注:附上所有运算法则的API
加 a1.add(b1).doubleValue(); //即是 a1+b1
减 a1.subtract(b1).doubleValue() //即是a1-b1
乘 a1.multiply(b1).doubleValue() //即是a1*b1
除 a1.divide(b1).doubleValue() //即是a1/b1
相关文章推荐
- java float double类型做小数点加减运算不准确
- JAVA float double数据类型保留2位小数点5种方法
- Java浮点类型(Double/Float)运算精度问题
- java中Double类型的运算精度丢失的问题 (小数点多出99999999999999)
- java中Double类型的运算精度丢失的问题 (小数点多出99999999999999)
- java中float,double类型运算的处理
- Java中,既然double类型比float类型,表示的数值范围更大,大家都用double类型不就行了,Java还发明float类型干什么?因为占内存少于double,其他没有任何优势了
- 关于java中Double类型的运算精度问题
- JAVA中控制double类型小数点后位数的方法
- JAVA中控制double类型小数点后位数的方法
- Java 浮点数 float和double类型的表示范围和精度
- Java Float类型 减法运算时精度丢失问题
- JAVA基本数据类型范围和float、double精度问题
- Java double/float数据类型中的0.0和-0.0问题
- Java基础-数据类型int,short,char,long,float,double,boolean,byte
- 关于java的double类型和float类型
- 关于java中Double类型的运算精度问题
- java中数据类型转换 Integer String Long Float Double Date
- 关于java中Double类型运算精度问题
- java float类型保留小数点后几位