java.math. Bigdecimal
简单来说,Java(包括其他程序语言)遵守E754浮点数运算( Floating- -Point Arithmetic规范,使用分数与指数来表示浮点数。例如,0.5会使用1/2来表示,0.75会使用1/2+1/4来表示,0.875会使用1/2+14+18来表示,而0.1会使用16+1/32+1256+1/512+1/4096+18192+…无限循环下去,无法精确表示,因而造成运算上的误差
再来举个例子,你觉得以下程序片段会显示什么结果?
由于浮点数误差的关系,结果是显示“不等于0.3”。类似的例子还很多,结论就是,如果要求精确度,那就要小心使用浮点数,而且别用=直接比较浮点数运算结果
double类型:1.0-0.8的结果不是0.2,而是0.19999999999999996
所以常用if(abs(result)<(pow(1,-6)))判断为相等
你使用别的程序语言(如 Javascript.、 Python等)也有可能显示这个结果。简单来说,Java(包括其他程序语言)遵守E754浮点数运算( Floating- -Point Arithmetic规范,使用分数与指数来表示浮点数。例如,0.5会使用1/2来表示,0.75会使用1/2+1/4来表示,0.875会使用1/2+14+18来表示,而0.1会使用16+1/32+1256+1/512+1/4096+18192+…无限循环下去,无法精确表示,因而造成运算上的误差
再来举个例子,你觉得以下程序片段会显示什么结果?
package hello;
public class BigDecimal {
public static void main(String[] args) {
double a=0.1,b=0.1,c=0.1;
if((a+b+c)==0.3) {
System.out.println("相等");
}else {
System.out.println("不相等");
}
}
}
由于浮点数误差的关系,结果是显示“不等于0.3”。类似的例子还很多,结论就是,如果要求精确度,那就要小心使用浮点数,而且别用=直接比较浮点数运算结果
可以使用java.math.Bigdecimal类.
BigDecimal op1=new BigDecimal("1.0");
BigDecimal op2=new BigDecimal("0.8");
BigDecimal result=op1.subtract(op2);
System.out.println(result);
输出为0.2.
同理new Bigdecimal 三个0.1调用add判断结果为相等
if(op.add(op2).add(op3).equals(result))
3、
BigDecimal op1=new BigDecimal("1.0");
BigDecimal op2=new BigDecimal("1.0");
System.out.println(op1==op2);//false
System.out.println(op1.equals(op2));//true
因为用==比较op1、op2,两者为两个新建的不同BigDecimal,
而equals 比较的是内含值0.1所以true