Java中double和float的比较及使用

Java中double和float的比较及使用在java中运行一下代码System.out.println(2.00-1.10);输出的结果是:0.8999999999999999很奇怪,并不是我们想要的值0.9再运行如下代码:System.out.println(2.00f-1.10f);输出结果:0.9又正确了,为什么会导致这种问题?程序中为什么要尽量避免浮点数比较?在java中浮点型默认是double的,及2.00和1….

大家好,欢迎来到IT知识分享网。Java中double和float的比较及使用

在java中运行一下代码

System.out.println(2.00-1.10);
输出的结果是:0.8999999999999999
很奇怪,并不是我们想要的值0.9

再运行如下代码:
System.out.println(2.00f-1.10f);
输出结果:0.9

又正确了,为什么会导致这种问题?程序中为什么要尽量避免浮点数比较?

在java中浮点型默认是double的,及2.00和1.10都要在计算机里转换进行二进制存储,这就涉及到数据精度,出现这个现象的原因正是浮点型数据的精度问题。先了解下float、double的基本知识:

  1. float和double是java的基本类型,用于浮点数表示,在java中float占4个字节32位,double占8个字节64位,一般比较适合用于工程测量计算中,其在内存里的存储结构如下:

float:

符号位(1 bit)
指数(8 bit)
尾数(23 bit)
double:

符号位(1 bit)
指数(11 bit)
尾数(52 bit)

注意:从左到右是从低位到高位,而在计算机内部是采用逆序存储的。

  1. System.out.println(2.00-1.10);中的1.10不能被计算机精确存储,以double类型数据1.10举例计算机如何将浮点型数据转换成二进制存储,
    这里重点讲小数部分转换成二进制:
    1.10整数部分就是1,转换成二进制1(这里整数转二进制不再赘述)
    小数部分:0.1
    0.12=0.2取整数部分0,基数=0.2
    0.2
    2=0.4取整数部分0,基数=0.4
    0.42=0.8取整数部分0,基数=0.8
    0.8
    2=1.6取整数部分1,基数=1.6-1=0.6
    0.62=1.2取整数部分1,基数=1.2-1=0.2
    0.2
    2=0.4取整数部分0,基数=0.4
    .
    .
    .
    .
    直至基数为0。1.1用二进制表示为:1.000110…xxxx…(后面表示省略)
    0.1 = 02(-1)+0*2(-2)+02(-3)+1*2(-4)+…而double类型表示小数部分只有52位,当向后计算 52位后基数还不为0,那后面的部分只能舍弃,从这里可以看出float、double并不能准确表示每一位小数,对于有的小数只能无限趋向它。在计算机 中加减成除运算实际上最后都要在计算机中转换成二进制的加运算,由此,当计算机运行System.out.println(2.00-1.10);
    时会拿他们在计算机内存中的二进制表示计算,而1.10的二进制表示本身就不准确,所以会出现0.8999999999999999的结果。

但为什么System.out.println(2.00f-1.10f);得出的结果是0.9呢。因为float精度没有double精度那么大,小数部分0.1二进制表示被舍去的比较多。

注意:

程序中应尽量避免浮点数的比较
float、double类型的运算往往都不准确
解决方法:

使用BigDecimal提供的方法进行比较或运算,但要注意在构造BigDecimal的时候使用float、double的字符串形式构建,BigDecimal(String val);为什么不用BigDecimal(double val)API里写的比较清楚。

运算以减法为例:

BigDecimal b1 = new BigDecimal(Double.toString(2.00));

BigDecimal b2 = new BigDecimal(Double.toString(1.10));

double result = b1.subtract(b2).doubleValue();

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/21647.html

(0)
上一篇 2024-01-17 08:15
下一篇 2024-01-17 10:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信