java BigDecimal解决浮点数的精度丢失和大数计算问题
java BigDecimal解决浮点数的精度丢失和大数计算问题
抛出浮点数问题:
先考个题,输入什么?
System.out.println(0.1 + 0.2);
答案:0.30000000000000004
在我们日常数学计算中,0.1+0.2不是等于0.3吗?为什么会等于0.30000000000000004?
因为这是计算机,计算机只认识二进制,0.1 0.2转换二进制相加是不能转成完整的二进制的
所以就会出现精度丢失问题,这无疑是个巨大的问题
解决精度丢失问题:
使用BigDecimal来解决刚刚那个问题:
BigDecimal bigDecimal = new BigDecimal("0.1");
BigDecimal bigDecimal2 = new BigDecimal("0.2");
System.out.println(bigDecimal.add(bigDecimal2)); // 0.3
原理:我们都知道整数运算是没有精度的,我们可以先把浮点数乘N转换成整数再进行运算,运算出的结果再除N
System.out.println(0.1 + 0.2); // 0.30000000000000004
System.out.println((double) (0.1 * 10 + 0.2 * 10) / 10); // 0.3
抛出大数问题:
众所周知,我们的基本数据类型long最大只能是9223372036854775807,如果我们超过了这个数字咋么办?
解决大数字问题:
使用BigDecimal来解决刚刚那个问题:
BigDecimal bigDecimal = new BigDecimal(Long.valueOf(Long.MAX_VALUE).toString());
BigDecimal bigDecimal2 = new BigDecimal(Long.valueOf(Long.MAX_VALUE).toString());
System.out.println(bigDecimal.add(bigDecimal2)); // 18446744073709551614
BigDecimal
构造函数:
- BigDecimal(int)
- BigDecimal(double)
- BigDecimal(long)
- BigDecimal(String)
其中对于double类型参数的构造方法,在不能完全由二进制表示完全的时候,仍然会出现精度缺失的情况,如果要传入一个double类型的数据,建议用String类型来代替如:BigDecimal(“0.3”);
常用方法:
加法 :bigDecimal.add(BigDecimal )
减法:bigDecimal.subtract(BigDecimal )
乘法:bigDecimal.multiply(BigDecimal )
除法:bigDecimal.divide(BigDecimal )
方法的返回值都是Bigdecimal 类型
java BigDecimal解决浮点数的精度丢失和大数计算问题的更多相关文章
- Java 中的浮点数取精度方法
Java 中的浮点数取精度方法 一.内容 一般在Java代码中取一个double类型的浮点数的精度,四舍五入或者直接舍去等的方式,使用了4种方法,推荐使用第一种,我已经封装成工具类了. 二.代码实现 ...
- java中double和float精度丢失问题及解决方法
在讨论两位double数0.2和0.3相加时,毫无疑问他们相加的结果是0.5.但是问题总是如此吗? 下面我们让下面两个doubles数相加,然后看看输出结果: @Test public void te ...
- java中double和float精度丢失问题
为什么会出现这个问题呢,就这是java和其它计算机语言都会出现的问题,下面我们分析一下为什么会出现这个问题:float和double类型主要是为了科学计算和工程计算而设计的.他们执行二进制浮点运算,这 ...
- Java Float类型 减法运算时精度丢失问题
package test1; public class Test2 { /*** @param args*/public static void main(String[] args) { Flo ...
- java防止double和float精度丢失的方法
在浮点数当中做运算时经常会出现精度丢失的情况,如果做项目不作处理的话会对商家造成很大的影响的.项目尤其是金融相关的项目对这些运算的精度要求较高. 问题原因:首先计算机进行的是二进制运算,我们输入的十进 ...
- Java 浮点数精度丢失
Java 浮点数精度丢失 问题引入 昨天帮室友写一个模拟发红包抢红包的程序时,对金额统一使用的 double 来建模,结果发现在实际运行时程序的结果在数值上总是有细微的误差,程序运行的截图: 输入依次 ...
- [ JAVA编程 ] double类型计算精度丢失问题及解决方法
前言 如果你在测试金融相关产品,请务必覆盖交易金额为小数的场景.特别是使用Java语言的初级开发. Java基本实例 先来看Java中double类型数值加.减.乘.除计算式实例: public cl ...
- Java:利用BigDecimal类巧妙处理Double类型精度丢失
目录 本篇要点 经典问题:浮点数精度丢失 十进制整数如何转化为二进制整数? 十进制小数如何转化为二进制数? 如何用BigDecimal解决double精度问题? new BigDecimal(doub ...
- 【java提高】(19)---BigDecimal详解和精度问题
BigDecimal详解和精度问题 一.背景 在实际开发中,对于 不需要任何准确计算精度的属性可以直接使用float或double,但是如果需要精确计算结果,则必须使用BigDecimal,例如价格. ...
- [转载]JavaScript 中小数和大整数的精度丢失
标题: JavaScript 中小数和大整数的精度丢失作者: Demon链接: http://demon.tw/copy-paste/javascript-precision.html版权: 本博客的 ...
随机推荐
- MordernC++之左值(引用)与右值(引用)
左值与右值 C++中左值与右值的概念是从C中继承而来,一种简单的定义是左值能够出现再表达式的左边或者右边,而右值只能出现在表达式的右边. int a = 5; // a是左值,5是右值 int b = ...
- 【Java SE】集合
1.java集合框架 使用Array存储对象有一定的弊端.java集合就是一种容器,动态地存储多个对象,存储主要是内存层面的存储,不涉及到持久化的存储(txt,avi,数据库). ①一旦初始化好,数组 ...
- abp(net core)+easyui+efcore实现仓储管理系统——模块管理升级之上(六十一)
Abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统--ABP总体介绍(一) abp(net core)+ ...
- Pandas的使用
在数据分析工作中,Pandas 的使用频率是很高的,一方面是因为 Pandas 提供的基础数据结构 DataFrame 与 json 的契合度很高,转换起来很方便.另一方面,如果日常的数据清理工作不是 ...
- day04-商家查询缓存03
功能02-商铺查询缓存03 3.功能02-商铺查询缓存 3.6封装redis工具类 3.6.1需求说明 基于StringRedisTemplate封装一个工具列,满足下列需求: 方法1:将任意Java ...
- RTSP Server(LIVE555)源码分析(四)-SETUP信令
主要分析RTSPServer::RTSPClientSession针对客户端SETUP事件处理 一. SETUP信令,handleCmd_SETUP源码解析 1)步骤1.03,parseTranspo ...
- MQTT-主题基础
MQTT主题 MQTT的主题是一个utf-8编码的字符串,最大长度65535字节,严格区分大小写 MQTT主题支持分层结构,主题分隔符用'/'表示,主题的层级长度可以为0 # 将主题划分为3个层级 ' ...
- [双目视差] 立体匹配算法推理 - SGBM算法(一)
文章目录 立体匹配算法推理 - SGBM算法(一) 一.SGBM与SGM的区别 二.代价计算 立体匹配算法推理 - SGBM算法(一) SGBM立体匹配算法,总体来讲包含以下6个步骤: Preproc ...
- 安装dataX的问题,com.alibaba.datax.common.exception.DataXException: Code:[Common-00], Describe
文章目录 报错 安装: 解决方法 总结 报错 com.alibaba.datax.common.exception.DataXException: Code:[Common-00], Describe ...
- 使用 MRKL 系统跨越神经符号鸿沟
本文展示了自然语言处理的下一步发展--模块化推理.知识和语言( the Modular Reasoning, Knowledge and Language,简称为MRKL)系统以及LangChain和 ...