Java-从Double类型精度丢失认识BigDecimal

参考资料

Double类型丢失精度

public static void main(String[] args) {
double value = 0.05 + 0.01;
System.out.println(value);
//0.060000000000000005
}

double 类型的 0.05 + 0.01 的结果我们猜想的应该是 0.06 但是程序的数据结果却是大大的超出了我们的预料(我们称这种现象为精度丢失),造成上面的这种情况的原因是小数在计算机中的存储形式造成的。

精度丢失的原因不是本篇博客的主要内容,所以在这里不再赘述,想要了解的可以查看,文章顶部的 IEEE 754 的规范。

double 类型存在着上面的这种问题,所以我们肯定是不能用它来进行特别精细的计算了,比如 科学研究金融 相关的业务逻辑。因为一旦数据不精确就可能造成比较严重的问题。

BigDecimal

既然出现了上面的这种问题,肯定是有解决办法的,官方提供的解决办法就是 BigDecimal 类。

与BigDecimal类似的还有BigInteger类.

构造BitDecimal

具有char[]参数的构造方法我们一般是不会去主动调用的,因为当我们调用具有string参数的构造函数时,会间接地调用char[]参数的构造方法。

public BigDecimal(String val) {
this(val.toCharArray(), 0, val.length());
}

在构建BigDecimal的时候推荐使用String参数的构造方法,因为double参数的构造方法会会出现一些问题。

public static void main(String[] args) {
BigDecimal bigDecimal = new BigDecimal(0.06);
System.out.println(bigDecimal); BigDecimal bigDecimalStr = new BigDecimal("0.06");
System.out.println(bigDecimalStr);
}

输出结果如下

0.059999999999999997779553950749686919152736663818359375
0.06

通过输出结果我们发现,当通过double参数的构造方法的来创建BigDecimal对象的时候,输出结果更加的让人头大了

Java-从Double类型精度丢失认识BigDecimal的更多相关文章

  1. Java:利用BigDecimal类巧妙处理Double类型精度丢失

    目录 本篇要点 经典问题:浮点数精度丢失 十进制整数如何转化为二进制整数? 十进制小数如何转化为二进制数? 如何用BigDecimal解决double精度问题? new BigDecimal(doub ...

  2. C# double类型精度丢失问题

    我们先看一段代码,可以在控制台程序中执行看看结果 { double d = 500; double d1 = 233.84; double d2 = d - d1; //d2=266.15999999 ...

  3. java下double相乘精度丢失问题

    比如 System.out.println(0.14*100); 输出: 14.000000000000002 解决方法: BigDecimal b = new BigDecimal(String.v ...

  4. [ JAVA编程 ] double类型计算精度丢失问题及解决方法

    前言 如果你在测试金融相关产品,请务必覆盖交易金额为小数的场景.特别是使用Java语言的初级开发. Java基本实例 先来看Java中double类型数值加.减.乘.除计算式实例: public cl ...

  5. Java中double类型的数据精确到小数点后两位

    Java中double类型的数据精确到小数点后两位 多余位四舍五入,四种方法 一: double f = 111231.5585;BigDecimal b = new BigDecimal(f); d ...

  6. java的double类型如何精确到一位小数?

    java的double类型如何精确到一位小数? //分钟转小时vacationNum = (double)Math.round(vacationNum/60*10)/10.0;overTimeNum ...

  7. Java 避免精度丢失之BigDecimal 运算

    * 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精确的浮点数运算,包括加减乘除和四舍五入 import java.math.BigDecimal; /** 计算工具类 */ pu ...

  8. 关于java中Double类型的运算精度问题

    标题     在Java中实现浮点数的精确计算    AYellow(原作) 修改    关键字     Java 浮点数 精确计算   问题的提出:如果我们编译运行下面这个程序会看到什么?publi ...

  9. 关于java中Double类型的运算精度问题(转)

    Java Java double:浮点数:精确计算  public class Test{    public static void main(String args[]){        Syst ...

随机推荐

  1. binary(binary区分大小写),unsigned,unsigned zerofill关键字介绍

    mysql建表时,每个字段的属性有三个选项: binary,unsigned,unsigned zerofill,作用如下: 一.binary CHAR VARCHAR:值根据缺省字符集以大小写不区分 ...

  2. laravel 里面结合关联查询 的when()用法

    Laravel 5.6 里面的when用法: $name = $request->get('name'); //活动标题 $start_time = $request->get('star ...

  3. java获取当前时间精确到毫秒

    转载:http://af8991.iteye.com/blog/1217672 import java.text.SimpleDateFormat; import java.util.Date; im ...

  4. IDEA复制项目操作

  5. 解开一个疑惑,为什么LVS开放的端口,使用netstat或ss命令,不能查找到其监听的端口呢?

    RT, 这个疑问,本周一直在心里,今天找到一个说法. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 另外LVS规则算是内核方法,用netstat -ntulp也显 ...

  6. openCV 备忘

    yum install python-devel numpy cmake gcc gcc-c++yum install gtk2-devel libdc1394-devel libv4l-devel ...

  7. [转] AES,SHA1,DES,RSA,MD5区别

    AES:更快,兼容设备,安全级别高: SHA1:公钥后处理回传 DES:本地数据,安全级别低 RSA:非对称加密,有公钥和私钥 MD5:防篡改 相关: 公开密钥加密(英语:public-key cry ...

  8. jquery .On()绑定事件的触发机制

    选择器只能选择已存在元素,其他元素需要作为参数传递给on

  9. sublime3 破解

    —– BEGIN LICENSE —–TwitterInc200 User LicenseEA7E-8900071D77F72E 390CDD93 4DCBA022 FAF6079061AA12C0 ...

  10. 【CF809D】Hitchhiking in the Baltic States

    题意: 给你n个区间[li,ri],让你选出从中一个子序列,然后在子序列的每个区间里都选择一个tj,满足t1<t2<...<tlent1<t2<...<tlen.最 ...