Java 数值类型以及计算

时间:2023-03-08 21:28:46

  前段时候写了一个对外提供的接口,其中有一个数值校验的计算。在测试的过程中发现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会下降很多,所以根据实际情况选择合适自己的方式。

 //定义数字格式化类
NumberFormat nf = NumberFormat.getInstance();
nf.setGroupingUsed(false);
nf.setMaximumFractionDigits(2);
double ysx = 5.6; 6 double jcx = 1.6;
//将double类型转换为BigDecimal
//必须先将double转换为string
BigDecimal ysx = new BigDecimal(nf.format(ysx);
BigDecimal jcx = new BigDecimal(nf.format(jcx));
//执行计算
BigDecimal ysc= jcx.subtract(ycx)
//比较大小14 //compareTo 只比较数值大小
//equals 比较数值大小以及精度
if(ysc.compareTo(jcx) == 0)