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 ...
随机推荐
- phpmyadmin 安装
首先,安装mysql $ sudo apt-get install mysql-server$ sudo apt-get install mysql-client安装时输出root用户的密码在安装ph ...
- 安装AngularJS Batarang遇到的问题
AngularJS Batarang是AngularJS在谷歌浏览器上的一个调试工具,因为国内目前无法访问谷歌浏览器应用商店,所以Batarang只能离线安装.不过在安装这个插件的过程中遇到了一些麻烦 ...
- 使用Java及相关内容的目标
培养设计高性能并发服务器架构能力. 基于高性能并发,创新应用和服务.
- 有一个字典对象,d = {'a':1,'b':2},请用尽量简洁的代码将d转换成{1: 'a', 2: 'b'}
题目:有一个字典对象,d = {'a':1,'b':2},请用尽量简洁的代码将d转换成{1: 'a', 2: 'b'} 第一种方法: d = {'a': 1, 'b': 2}d = {value: k ...
- OpenCV trackbar 避免使用全局变量
OpenCV trackbar 避免使用全局变量 在OpenCV中使用trackbar是交互式地图像处理的一种方式,例如用于图像阈值分割,用户可以一边调整阈值一边看效果.但是很不幸,绝大多数教程上使用 ...
- 函数wait和waitpid
函数wait 一个进程在终止时会关闭所有文件描述符,释放在用户空间释放的内存,但它的PCB还保留着,内核在其中保存一些信息:如果是正常终止时则保存着退出状态,如果是异常终止则保存着导致该进程终止的信号 ...
- .Net页面缓存OutPutCache详解
一 它在Web.Config中的位置 <system.web> <!--页面缓存--> <caching> <outputCacheSettings> ...
- A - Points and Segments CodeForces - 429E
题解: 方法非常巧妙的一道题 首先考虑要求全部为0怎么做 发现是个欧拉回路的问题(很巧妙) 直接dfs一遍就可以了 而这道题 要求是-1,1,0 我们可以先离散化 完了之后判断每个点被奇数还是偶数条边 ...
- python之GIL release (I/O open(file) socket time.sleep)
0.目录 2.线索 C源代码 Py_BEGIN_ALLOW_THREADS Py_END_ALLOW_THREADS3.open(name[, mode[, buffering]]) -> fi ...
- python全栈开发day87~91-整个流程梳理、CRM功能、知识点梳理
1.流程 1. stark组件 1. 启动 2.注册 3.url设计 4.视图函数设计 1.展示数据头 2.展示数据 3.list_display功能实现 4.list_display_links 功 ...