double类型相加(減、乘、除)结果会有些误差
今天在调试代码的时候发现了⼀个double类型数据相减的有趣问题,148163.1 - 82692.09⼤家猜猜结果等于多少,经过调试最终为5471.010*********。
是不是很奇怪,下⾯将说明这其中的奥妙!
double属于floating binary point types,也就是说都double型的数值在相加减的时候,会将数值转换成⼆进制的数值
如10001.10010110011这种表⽰发再做相加减,但是在转换成⼆进制代码表⽰的时候,存储⼩数部分的位数会有不够的现象,即⽆限循环⼩数,这就是造成微差距的主要原因。
1.只取需要⽤到的位数:
⼩数点台后⾯的位数部分就不要管了,不过这种⽅法不太好。
2.使⽤Decimal类型:
⽤Decimal就不会出现上⾯的问题了,可以准确的计算⼩数值,知识Decimal的范围⽐double⼩,⼀般情况下也够⽤了。
Decimal类型的有效位数达到28位,⽽double类型的16位,所以Decimal类型⽐Double类型能表⽰更精确的浮点数。
1.在double类型数值进⾏⽐较⼤⼩的情况最好使⽤1.02-1.01==double.MinValue这种⽅式进⾏判断
2.使⽤double类型进⾏加减的情况下看看能否使⽤Decimal类型进⾏计算
会计英文怎么说
package org.lxh.demo11.numberdemo;
import java.math.BigDecimal;
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("加法运算:" +
3.333), 1));
System.out.println("乘法运算:" +麻辣小吃
什么必报und(MyMath.mul(10.345,
3.333), 3));
System.out.println("除法运算:" +
MyMath.div(10.345, 3.333, 3));
System.out.println("减法运算:" +
3.333), 3));
}
}