在java开发中,你也许会遇到 浮点数 时会丢失精度,那么先看看例子。
Double a=3.00;
double b=2.10;
double c=a-b;
System.out.println(“c=”+c);
c=0.8999999999999999
Float e=3.00f;
float f=2.10f;
float g=e-f;
System.out.println(“g=”+g);
g=0.9000001
显然这结果都不是我们想要的。
为什么 浮点型 运算为什么会造成精度丢失?
在计算机中,保存这个数使用的是浮点表示法,分为三大部分:
第一部分用来存储符号位(sign),用来区分正负数,这里是0,表示正数
第二部分用来存储指数(exponent),这里的指数是十进制的6
第三部分用来存储小数(fraction),这里的小数部分是001110011
比如float类型是32位,是 单精度 浮点表示法:
符号位(sign)占用1位,用来表示正负数,
指数位(exponent)占用8位,用来表示指数,
小数位(fraction)占用23位,用来表示小数,不足位数补0。
而double类型是64位,是双精度浮点表示法:
符号位占用1位,指数位占用11位,小数位占用52位。
指数位决定了大小范围,因为指数位能表示的数越大则能表示的数越大。
而小数位决定了计算精度,因为小数位能表示的数越大,则能计算的精度越大。
注意:
- 程序中应尽量避免浮点数的比较
- float、double类型的运算往往都不准确
解决方法:
使用BigDecimal提供的方法进行比较或运算,但要注意在构造BigDecimal的时候使用float、double的字符串形式构建,BigDecimal(String val);
运算以减法为例:
BigDecimal a1 = new BigDecimal(Double. toString (a));
BigDecimal b1 = new BigDecimal(Double.toString(b));
double c1 = a1.subtract(b1).doubleValue();
System.out.println(“c1=”+c1);
c1=0.9
BigDecimal e1 = new BigDecimal(Float.toString(e));
BigDecimal f1 = new BigDecimal(Float.toString(f));
float g1 = e1.subtract(f1).floatValue();
System.out.println(“g1=”+g1);
g1=0.9
显然0.9才是我们想要的结果。
Motor amplitude, cortical threshold, central motor conduction time and silent periods can be easily evaluated using this method 195
The present study had limitations 9 6 351 359 2002
PMID 15325034 Review
2004; 89 8 3821 9 04 And what this protein does