Java-从Double类型精度丢失认识BigDecimal
Java-从Double类型精度丢失认识BigDecimal
参考资料
- https://www.jianshu.com/p/07e3eeb90f18
- https://zh.wikipedia.org/wiki/IEEE_754
- https://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html
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的更多相关文章
- Java:利用BigDecimal类巧妙处理Double类型精度丢失
目录 本篇要点 经典问题:浮点数精度丢失 十进制整数如何转化为二进制整数? 十进制小数如何转化为二进制数? 如何用BigDecimal解决double精度问题? new BigDecimal(doub ...
- C# double类型精度丢失问题
我们先看一段代码,可以在控制台程序中执行看看结果 { double d = 500; double d1 = 233.84; double d2 = d - d1; //d2=266.15999999 ...
- java下double相乘精度丢失问题
比如 System.out.println(0.14*100); 输出: 14.000000000000002 解决方法: BigDecimal b = new BigDecimal(String.v ...
- [ JAVA编程 ] double类型计算精度丢失问题及解决方法
前言 如果你在测试金融相关产品,请务必覆盖交易金额为小数的场景.特别是使用Java语言的初级开发. Java基本实例 先来看Java中double类型数值加.减.乘.除计算式实例: public cl ...
- Java中double类型的数据精确到小数点后两位
Java中double类型的数据精确到小数点后两位 多余位四舍五入,四种方法 一: double f = 111231.5585;BigDecimal b = new BigDecimal(f); d ...
- java的double类型如何精确到一位小数?
java的double类型如何精确到一位小数? //分钟转小时vacationNum = (double)Math.round(vacationNum/60*10)/10.0;overTimeNum ...
- Java 避免精度丢失之BigDecimal 运算
* 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精确的浮点数运算,包括加减乘除和四舍五入 import java.math.BigDecimal; /** 计算工具类 */ pu ...
- 关于java中Double类型的运算精度问题
标题 在Java中实现浮点数的精确计算 AYellow(原作) 修改 关键字 Java 浮点数 精确计算 问题的提出:如果我们编译运行下面这个程序会看到什么?publi ...
- 关于java中Double类型的运算精度问题(转)
Java Java double:浮点数:精确计算 public class Test{ public static void main(String args[]){ Syst ...
随机推荐
- 小LK玩积木
小LK玩积木 时间限制: 1 Sec 内存限制: 128 MB 题目描述 HH最近通过黑洞APP下载了一个盗梦APP,据说能进入一个人的梦里做一些嘿嘿嘿的事情,秉着怀疑的态度HH偷偷地潜入LK的梦中 ...
- shell 批量替换内容
一.查找/data/www/vhosts/WOStest2_YiiFramework/console/sh/下所有.sh文件 把/data/www/vhosts/WOS_YiiFramework 替换 ...
- mysql的基础知识
一.存储引擎 mysql> show engines; +--------------------+---------+------------------------------------- ...
- 步步為營-96-MyMVC2
說明:地址欄中的URL還存在一些不足之處 地址欄中最好能是http"www.sss.com/asdf/aaa 1.1 模擬路由的原理:創建Routing文件夾,并添加URLRoutingMo ...
- 记录sql server中数据创建时间和最后修改时间,方便查找问题
getdate()用例: 2008-12-29 16:25:46.635 1.创建时间:将字段设置为datetime类型,并设置默认值为 getdate() 2.修改时间:通过触发器,在 update ...
- ElasticSearch(五) Elasticsearch-jdbc实现MySQL同步到ElasticSearch
https://www.cnblogs.com/wt645631686/p/8274722.html
- RSA javascript加密 lua解密
一个在线RSA非对称加密解密,可以用这个地址生成公钥和私钥 https://blog.zhengxianjun.com/online-tool/rsa/ javascript加密 jsencrypt. ...
- json2csharp & json 格式化
json2csharp: http://json2csharp.com/ bejson: http://www.bejson.com/
- ES标准
精确来说,ES1 ~ ES5 中的数字是 ECMA-262 标准的版本号(edition). 即:Standard ECMA-262, 1st Edition(其实第一个版本是没有版本号的)Stand ...
- IIS异常
http 错误 500.19 - internal server error 今天发布wcf到本地的IIS上,访问时出现了500.19错误.有效解决办法:是因为IIS没有安装完全,把能勾选的全部勾选上 ...