浮点数精度丢失的原因和解决办法

二进制浮点数转换为十进制浮点数

在这里插入图片描述

十进制浮点数转换为二进制浮点数

在这里插入图片描述

浮点数的存储

在这里插入图片描述

在这里插入图片描述

float类型在计算机中的存储形式中指数为什么要加127,而double类型要加1023?

以float为例,计算机表示单精度浮点数时,是用8位去存储指数部分,即表示0-255,但我们同样需要有负指数,正负指数的位数量为了均等,各自一半,-127-128。0是特殊点,特殊处理。储存时候会加上127,这样就刚刚好是0~255,就能很好的储存了,不然,不移量的话需要判断符号位来判断数值的正负。
在这里插入图片描述

浮点数加减运算时可能精度丢失的原因

public static void main(String[] args) {
    
    
      System.out.println(2.0f-1.5f);//0.5
      System.out.println(2.0f-1.4f);//0.6
      System.out.println(2.0f-1.3f);//0.70000005
}

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

如何避免精度丢失

使用float和double进行运算时可能会有进度丢失,因此实际开发中不建议直接使用float和都被进行运算,而是使用new BigDecimal(String str)来解决:

public static void main(String[] args) {
    
    
   System.out.println(2.0f-1.3f);//0.70000005
   System.out.println(new BigDecimal(2.0f).subtract(new BigDecimal(1.3f)));//0.7000000476837158203125
   System.out.println(BigDecimal.valueOf(2.0f).subtract(BigDecimal.valueOf(1.3f)));//0.7000000476837158
   //new BigDecimal(String str)这种方式可以解决浮点数问题
   System.out.println(new BigDecimal(String.valueOf(2.0f)).subtract(new BigDecimal(String.valueOf(1.3f))));//0.7
}

猜你喜欢

转载自blog.csdn.net/user2025/article/details/107746452