您的位置 首页 java

为什么Java float和double运算会丢失精度?

在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才是我们想要的结果。

文章来源:智云一二三科技

文章标题:为什么Java float和double运算会丢失精度?

文章地址:https://www.zhihuclub.com/178535.shtml

关于作者: 智云科技

热门文章

评论已关闭

4条评论

  1. Motor amplitude, cortical threshold, central motor conduction time and silent periods can be easily evaluated using this method 195

网站地图