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 ...
随机推荐
- django 中自带的加密方法
导入django 自带的加密算法 和flask中的哈希加密有一曲同工之妙. from django.contrib.auth.hashers import make_password, ...
- 整合Flask中的目录结构
一.SQLAlchemy-Utils 由于sqlalchemy中没有提供choice方法,所以借助SQLAlchemy-Utils组件提供的choice方法 import datetime from ...
- Linux基础实操二
实操一: 1) 新建用户natasha uid为1000,gid为555,备注信息为“master” 2) 修改natasha用户的家目录为/Natasha 3) 查看用户信息配置文件的最后一行 ca ...
- C++ 使用system()实现锁定屏幕
除了使用函数“LockWorkStation()”实现锁定屏幕,参考:http://www.cnblogs.com/Satu/p/8183081.html 此外,也可以使用函数“system()”来实 ...
- C++ Primer 笔记——固有的不可移植的特性
1.为了支持底层编程,C++定义了一些固有的不可移植的特性,所谓不可移植特性是指因机器而异的特性. 2.一个位域中含有一定数量的二进制位,位域在内存中的布局是机器相关的.位域的类型必须是整型或枚举类型 ...
- 关于C++ const 的全面总结 (转)
C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下,期望对朋友们有所帮助. Const 是C++中常用的类型修饰符,常类型是指使用类 ...
- 20165206 2017-2018-2 《Java程序设计》第9周学习总结
20165206 2017-2018-2 <Java程序设计>第9周学习总结 教材学习内容总结 URL类:URL类是java.net包中的一个重要的类,使用URL创建对象的应用程序称为客户 ...
- 据说是Flord算法
贵有恒,何必三更起五更眠:最无益,莫过一日曝十日寒. 问题 C: Restoring Road Network 问题 C: Restoring Road Network 时间限制: 1 Sec 内存 ...
- vs2017初学c++环境配置及使用教程
https://blog.csdn.net/jmpan_sjtu/article/details/79053169 https://blog.csdn.net/luoyu510183/article/ ...
- DDD实践:领域事件
要求:修改good表,添加 organization 基础定义 用于引发和调度事件的延迟方法 AddDomainEvent Domain\SeedWork\Entity.cs public abstr ...