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解决浮点数的精度丢失和大数计算问题的更多相关文章

  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. mysql的查询--子查询,order by,group by,having

    一. 1.多表查询 格式1: select 字段列表 from 表1 join 表2 on 表1.字段1=表2.字段1 where 查询条件 格式2: select 字段列表 from 表1 join ...

  2. LeeCode数组问题(一)

    LeeCode 27:移除元素 题目描述: 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度length. 不要使用额外的数组空间,你 ...

  3. 从ajax到跨域引发的相关面试题总结

    转载请注明出处: 1.ajax异步和同步的区别 Ajax是一种基于JavaScript语言和XMLHttpRequest对象的异步数据传输技术,通过它可以使不用刷新整个页面的情况下,对页面进行部分更新 ...

  4. FBV和CBV的区别(源码分析)

    FBV和CBV源码分析 FBV直接调用user方法执行业务代码 CBV相当于在FBV上面封装了一层 from django.contrib import admin from django.urls ...

  5. If选择语句的用法

    今天我们学习下If判断语句. 首先了解下它有几种用法: If单选择语句 If双选择语句 If多选择语句 我们一个一个用,每一个用法都给一个运用的过程演练一下. If单选择语句:我们很多需要判断一个东西 ...

  6. 【Python毕业设计】基于Python+Flask+MySQL的学生信息管理系统(附完整源码)

    1.项目说明基于python+Flask+mysql的学生信息管理系统项目实战 项目需要安装pycharm专业版,mysql数据库以及项目所需的所有模块创建数据库名称db_online_notes,然 ...

  7. html/css 添加图片

    通过img.src添加图片 添加一个img元素,设置content,会发现在IE.safari等浏览器内显示为空白. 一般我们使用img,是通过src来设置的,可以通过react的import图片添加 ...

  8. 目标检测(Object Detection)

    文章目录 目标检测(Object Detection) 一.基本概念 1. 什么是目标检测 2. 目标检测的核心问题 3. 目标检测算法分类 1)Tow Stage 2)One Stage 4. 目标 ...

  9. 【经验分享】使用Windows自带Xbox显示游戏帧率

    环境: 工具:Xbox Game Bar 系统版本:Windows 10 快捷键:win + G 需求描述: 描述:需要实时显示当前游戏的帧率和硬件的占用率情况.如下图: 实现方法: 1.按下组合键w ...

  10. Git&GitHub简介与入手(三)

    五.eclipse中的git使用 1.eclipse中本地库操作 (检测显示创建成功): (设置本地库范围签名): (一些git里的图标,保存着不同内容): https://github.com/gi ...