java BigDecimal解决浮点数的精度丢失和大数计算问题

抛出浮点数问题:

先考个题,输入什么?

  1. System.out.println(0.1 + 0.2);

答案:0.30000000000000004

在我们日常数学计算中,0.1+0.2不是等于0.3吗?为什么会等于0.30000000000000004?

因为这是计算机,计算机只认识二进制,0.1 0.2转换二进制相加是不能转成完整的二进制的

所以就会出现精度丢失问题,这无疑是个巨大的问题

解决精度丢失问题:

使用BigDecimal来解决刚刚那个问题:

  1. BigDecimal bigDecimal = new BigDecimal("0.1");
  2. BigDecimal bigDecimal2 = new BigDecimal("0.2");
  3. System.out.println(bigDecimal.add(bigDecimal2)); // 0.3

原理:我们都知道整数运算是没有精度的,我们可以先把浮点数乘N转换成整数再进行运算,运算出的结果再除N

  1. System.out.println(0.1 + 0.2); // 0.30000000000000004
  2. System.out.println((double) (0.1 * 10 + 0.2 * 10) / 10); // 0.3

抛出大数问题:

众所周知,我们的基本数据类型long最大只能是9223372036854775807,如果我们超过了这个数字咋么办?

解决大数字问题:

使用BigDecimal来解决刚刚那个问题:

  1. BigDecimal bigDecimal = new BigDecimal(Long.valueOf(Long.MAX_VALUE).toString());
  2. BigDecimal bigDecimal2 = new BigDecimal(Long.valueOf(Long.MAX_VALUE).toString());
  3. 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解决浮点数的精度丢失和大数计算问题的更多相关文章

  1. Java 中的浮点数取精度方法

    Java 中的浮点数取精度方法 一.内容 一般在Java代码中取一个double类型的浮点数的精度,四舍五入或者直接舍去等的方式,使用了4种方法,推荐使用第一种,我已经封装成工具类了. 二.代码实现 ...

  2. java中double和float精度丢失问题及解决方法

    在讨论两位double数0.2和0.3相加时,毫无疑问他们相加的结果是0.5.但是问题总是如此吗? 下面我们让下面两个doubles数相加,然后看看输出结果: @Test public void te ...

  3. java中double和float精度丢失问题

    为什么会出现这个问题呢,就这是java和其它计算机语言都会出现的问题,下面我们分析一下为什么会出现这个问题:float和double类型主要是为了科学计算和工程计算而设计的.他们执行二进制浮点运算,这 ...

  4. Java Float类型 减法运算时精度丢失问题

    package test1; public class Test2 { /*** @param args*/public static void main(String[] args) {   Flo ...

  5. java防止double和float精度丢失的方法

    在浮点数当中做运算时经常会出现精度丢失的情况,如果做项目不作处理的话会对商家造成很大的影响的.项目尤其是金融相关的项目对这些运算的精度要求较高. 问题原因:首先计算机进行的是二进制运算,我们输入的十进 ...

  6. Java 浮点数精度丢失

    Java 浮点数精度丢失 问题引入 昨天帮室友写一个模拟发红包抢红包的程序时,对金额统一使用的 double 来建模,结果发现在实际运行时程序的结果在数值上总是有细微的误差,程序运行的截图: 输入依次 ...

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

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

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

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

  9. 【java提高】(19)---BigDecimal详解和精度问题

    BigDecimal详解和精度问题 一.背景 在实际开发中,对于 不需要任何准确计算精度的属性可以直接使用float或double,但是如果需要精确计算结果,则必须使用BigDecimal,例如价格. ...

  10. [转载]JavaScript 中小数和大整数的精度丢失

    标题: JavaScript 中小数和大整数的精度丢失作者: Demon链接: http://demon.tw/copy-paste/javascript-precision.html版权: 本博客的 ...

随机推荐

  1. [SpringBoot]Spring Boot Framework @ Environment / ApplicationContext & SpringApplication

    [#]: 表示较为重要 1 Spring Boot Overview SpringBoot是一个快速开发框架,快速的将一些常用的第三方依赖整合(原理:通过Maven子父工程的方式),简化XML配置,全 ...

  2. 为什么C++语言性能优越?

    面试时被问到这个问题,发现自己一直以来理所当然的认为C++快,却没有具体分析原因.下面简单总结一下为什么快. 当我们编写程序时,我们需要将程序转换为计算机可以理解的机器语言.不同的语言有不同的执行机制 ...

  3. odoo 开发入门教程系列-模块交互

    模块交互 在上一章中,我们使用继承来修改模块的行为.在我们的房地产场景中,我们希望更进一步,能够为客户生成发票.Odoo提供了一个开发票模块,因此直接从我们的房地产模块创建发票是很简单的,也就是说,一 ...

  4. TiDB在X86和ARM混合平台下的离线部署和升级

    [是否原创]是 [首发渠道]TiDB 社区 背景 在之前我们团队发布了TiDB基于X86和ARM混合部署架构的文章:TiDB 5.0 异步事务特性体验--基于X86和ARM混合部署架构,最近有朋友问到 ...

  5. SpringBoot 使用 Sa-Token 完成权限认证

    一.设计思路 所谓权限认证,核心逻辑就是判断一个账号是否拥有指定权限: 有,就让你通过. 没有?那么禁止访问! 深入到底层数据中,就是每个账号都会拥有一个权限码集合,框架来校验这个集合中是否包含指定的 ...

  6. 大规模 Transformer 模型 8 比特矩阵乘简介 - 基于 Hugging Face Transformers、Accelerate 以及 bitsandbytes

    引言 语言模型一直在变大.截至撰写本文时,PaLM 有 5400 亿参数,OPT.GPT-3 和 BLOOM 有大约 1760 亿参数,而且我们仍在继续朝着更大的模型发展.下图总结了最近的一些语言模型 ...

  7. YOLO4论文中文版

    文章目录 YOLO4论文中文版 摘要 1.介绍 2.相关工作 2.1.目标检测模型 2.2.Bag of freebies 2.3.Bag of specials 3.方法 3.1.架构选择 3.2. ...

  8. #PowerBI 1分钟学会,利用format函数,自定义格式显示

    PowerBI是一款强大的数据分析和可视化工具,它可以帮助我们快速地创建各种报表和仪表盘,展示数据的洞察和价值. 在PowerBI中,有许多内置的函数可以帮助我们处理和转换数据,其中一个常用的函数就是 ...

  9. 2023-01-05:konradkleine/docker-registry-frontend是registry的web界面工具之一。请问部署在k3s中,yaml如何写?

    2023-01-05:konradkleine/docker-registry-frontend是registry的web界面工具之一.请问部署在k3s中,yaml如何写? 答案2023-01-05: ...

  10. 2022-09-17:一个字符串s,表示仓库的墙 与 货物,其中‘|‘表示墙,‘*‘表示货物。 给定一个起始下标start和一个终止下标end, 找出子串中 被墙包裹的货物 数量。 比如: s = “

    2022-09-17:一个字符串s,表示仓库的墙 与 货物,其中'|'表示墙,''表示货物. 给定一个起始下标start和一个终止下标end, 找出子串中 被墙包裹的货物 数量. 比如: s = &q ...