Java 数值类型以及计算

   前段时候写了一个对外提供的接口,其中有一个数值校验的计算。在测试的过程中发现5.6-1.6 != 4,究其原因是double类型的数值有精度丢失的现象,看来还是基础知识不牢固,在网上找了些文档从头看了下Java基本数值类型,好多东西已经忘记了,什么二进制补码、原码、反码统统忘记了,回想起大学数学.....(越扯越远了)。

   基本数据类型和浮点数精度问题引用俩篇现有的博客就不在重复造轮子了,精度问题好像扯得比较多,说实话没看懂,主要写写如何处理精度问题吧。

Java的基本数据类型   

  引用:http://www.cnblogs.com/1130136248wlxk/articles/5105524.html

Java double 精度问题

  引用:https://www.iovi.com/post/2014-07-07-talk-about-double-in-java.html

看了一遍有些没有看懂,但是得出的结论是:double之所以产生精度的丢失,最根本的原因是用于表示小数的二进制位数不够,然后做round,造成丢失。

      既然Java的浮点数运算为产生精度问题,那么对于需要精确运算结果的系统如何处理呢?

      Effective Java 第48条 如果需要精确的答案,请避免使用flaot和double,flaot和double 主要是为科学计算和工程计算而设计的,如果需要精确计算请使用BigDecimal,不过BigDecimal的性能相比double会下降很多,所以根据实际情况选择合适自己的方式。 

 1 //定义数字格式化类
 2 NumberFormat nf = NumberFormat.getInstance(); 
 3 nf.setGroupingUsed(false);
 4 nf.setMaximumFractionDigits(2); 
 5 double ysx = 5.6; 6 double jcx = 1.6;
 6 //将double类型转换为BigDecimal 
 7 //必须先将double转换为string 
 8 BigDecimal ysx = new BigDecimal(nf.format(ysx);
 9 BigDecimal jcx = new BigDecimal(nf.format(jcx));
10 //执行计算
11 BigDecimal ysc= jcx.subtract(ycx)
12 //比较大小14 //compareTo 只比较数值大小
13 //equals 比较数值大小以及精度
14 if(ysc.compareTo(jcx) == 0)
原文地址:https://www.cnblogs.com/zhouxiangting/p/6543254.html