一、发现问题

float、double两种基本类型在运算的时候容易引起精度丢失。以float为例说明。

public static void main(String[] args) {

float x = 1.0f;
   float y = 0.8f;
   float z = x - y;
   System.out.println(z);
}
结果是0.19999999

二、解决办法

利用java.math中的BigDecimal类进行操作

public static void main(String[] args) {

float x = 1.0f;
   float y = 0.8f;
  
   BigDecimal x1 = new BigDecimal(Float.toString(x));
   BigDecimal x2 = new BigDecimal(Float.toString(y));
   float z = x1.subtract(x2).floatValue(); 
   System.out.println(z);
}
结果是0.2

三、注意点

注意点1

new BigDecimal(...)填写构造函数的时候,一定要使用String,而不要使用float或者double,否则同样会引起精度丢失。

注意点2
public static void main(String[] args) {
   float x = 1.0f;
   float y = 0.8f;
   BigDecimal x1 = new BigDecimal(Float.toString(x));
   BigDecimal x2 = new BigDecimal(Float.toString(y));
   x1.subtract(x2);
   System.out.println(x1);
}
x1仍然是1.0,因为不是引用类型。正确的是如下写法:

public static void main(String[] args) {
   float x = 1.0f;
   float y = 0.8f;
   BigDecimal x1 = new BigDecimal(Float.toString(x));
   BigDecimal x2 = new BigDecimal(Float.toString(y));
   x1 = x1.subtract(x2);
   System.out.println(x1);

}

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

java中float double利用BigDecimal运算相关推荐

  1. java中float、double和BigDecimal的精度问题(fastjson、Jackson以及实例化的方式)

    java中float.double和BigDecimal的精度问题(fastjson.Jackson以及实例化的方式): 问题描述 java中如果使用float或double类型的数据初始化BigDe ...

  2. java怎么进行浮点数运算_【考试经验】Java中实现浮点数的精确运算

    [考试经验]Java中实现浮点数的精确运算 package com.lv; import java.math.BigDecimal; public class Arith { public stati ...

  3. Java中关于double、Double相关问题总结

    标题 java中double与Double的区别 声明double变量的时候,加d与不加d有什么区别 java中float与double的区别 java Double 详解 BigDecimal.Do ...

  4. Java中实现精确的浮点数运算

    我们知道,在 Java 中直接对浮点数进行运算会出现精度丢失的现象,那么如何解决这一问题呢? 我们需要借助 BigDecimal 来帮助我们进行浮点数的运算!!! 一.精确的浮点数运算示例代码 //示 ...

  5. java 格式化 浮点数_DecimalFormat的用法 Java 浮点数 Float Double 小数 格式化 保留小数位后几位等...

    DecimalFormat的用法  Java 浮点数 Float Double 小数 格式化 保留小数位后几位等 DecimalFormat df = new DecimalFormat(); dou ...

  6. Java中list如何利用遍历进行删除操作

    转: Java中list如何利用遍历进行删除操作 2018年03月31日 10:23:41 Little White_007 阅读数:3874 Java三种遍历如何进行list的便利删除: 1.for ...

  7. 为什么Java中float类型的取值范围大于long类型

    在学习Java的过程中,我遇到了一个很有意思的问题,就是为什么Java中float类型的取值范围会大于long类型. 类型名 大小/字节 取值范围 float 4(32bit) -3.4E+38 ~ ...

  8. Java中float和double精度

    http://zhidao.baidu.com/question/344295417.html?seed=0 float与double的区别 单精度浮点数在机内占4个字节,用32位二进制描述. 双精度 ...

  9. java中float%int_java中short、int、long、float、double取值范围

    一.分析基本数据类型的特点,最大值和最小值. 1. 基本类型:int 二进制位数:32 包装类:java.lang.Integer 最小值:Integer.MIN_VALUE= -2147483648 ...

  10. java中float和double为什么会转为科学记数法?

    1.背景 在日常开发中有时会使用到float或double数据类型,然而在前端接收到数据时发现数据为科学记数法,此时不能满足业务显示直观的需求.为什么float和double会变成科学记数法格式呢?什 ...

最新文章

  1. MIT录取不再看SAT科目成绩:曾是华裔传统优势,数学等学科测验更是中国留学生强项...
  2. 异步FIFO芯片IDT7204、IDT7205的使用
  3. linux内核网络协议栈--数据包的网卡驱动收发包过程(二十五)
  4. 用gdb调试core dump文件
  5. 图像处理和计算机视觉中的经典论文
  6. 使用jdk压缩war包
  7. java inject例子_java – 手动实例化@InjectMock带注释的字段
  8. 数字反转(信息学奥赛一本通-T1089)
  9. coddenomicon工具
  10. 计算机组成原理作业三
  11. 红外测试操作步骤_红外分光测油仪操作步骤及注意事项
  12. js 页面 json对象转数组
  13. 如何删除双系统(超级详细,手把手教学)
  14. 机器学习如何影响系统设计:Learned Index Structures浅析
  15. 关于配色常见的几种搭配方式
  16. 项目无法启动,Disconnected from the target VM
  17. 微信视频号推出“创作者流量包”
  18. 学tlc和JAVA,#Java学习之路——第一部分总结
  19. 云破月来花弄影-SVG多种技术组合实现
  20. 从移动互联网困局漫谈人工智能的未来

热门文章

  1. Oracle.start with … connect by [… and] prior…order siblings by …
  2. manifest.json文件的 “name” “description” “version 字段解释
  3. 什么是开源(Open Source)?
  4. 几个清华和北邮学霸公众号,值得学习
  5. 用R将图片转为字符画
  6. Rstudio 1.2 新功能介绍
  7. 任意文件下载漏洞学习
  8. Linux之文件基础操作命令
  9. 在vue中动态添加商品SKU
  10. CodeForces - 729D