Java中BigDecimal类的使用详解

不论是float 还是double都是浮点数,而计算机是二进制的,浮点数会失去一定的精确度。Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。

一、BigDecimal转换取Double数据

假设我们有一个数据是:
Double num = 123456789.98;
我们用java怎么取到这个数值呢。
经过笔者测试:

 Double num = 123456789.98;
    BigDecimal bg1=new BigDecimal(num);
    BigDecimal bg2=new BigDecimal(num + "");
    System.err.println(num);
    System.err.println(bg1);
    System.err.println(bg2);

我们得到:

所以呢,取Double数据的方法是:

 Double num = 123456789.98;
  BigDecimal bg2=new BigDecimal(num + ""); 

二、BigDecimal去掉科学计数法

 java.text.NumberFormat NF = java.text.NumberFormat.getInstance();
    NF.setGroupingUsed(false);//去掉科学计数法显示
    System.err.println("d:="+NF.format(num));

三、BigDecimal的加法减法乘法除法运算。

常规我们想到的加法:
Double aa = num + num;
System.err.println(aa);
BigDecimal bb =new BigDecimal(aa + "");
System.err.println(bb);

快拿计算机算算,是对的吧。
接下来咱们看,正规一点的写法

BigDecimal b1 = new BigDecimal(Double.toString(num));
  BigDecimal b2 = new BigDecimal(Double.toString(num));
  System.err.println(b1.add(b2).doubleValue());
  BigDecimal cc =new BigDecimal(b1.add(b2).doubleValue());
System.err.println(cc);

就测试结果而言呢,还是按照我们常规的想法走吧。
b1.subtract(b2).doubleValue();//减法
b1.multiply(b2).doubleValue();//乘法
b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();//除法
四、接下来,我们测试最后一个乘法
这个精度可能超出了Double的精度,我们减小一下
6789.98 x 6789.98 =46103828.4004
上代码测试:
常规:

Double num = 6789.98;
    Double dd = num * num;
    System.err.println(dd);
    BigDecimal ee =new BigDecimal(dd + "");
    System.err.println(ee);

精确:

Double yysds = 6789.98;
    BigDecimal b1 = new BigDecimal(Double.toString(yysds));
    BigDecimal b2 = new BigDecimal(Double.toString(yysds));
    System.err.println(b1.multiply(b2).doubleValue());
    BigDecimal cc =new BigDecimal(b1.multiply(b2).doubleValue());
    System.err.println(cc);

上结果

看来涉及小数的计算,还是需要留意的。
其实笔者总结:取Double的值,转化一下。计算的时候就按照常规的方法来计算,只是取值的时候转一下。

到此这篇关于Java中BigDecimal类的使用详解的文章就介绍到这了,更多相关Java中BigDecimal类内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2020-07-23

Java中使用BigDecimal进行精确运算

首先我们先来看如下代码示例: public class Test_1 { public static void main(String[] args) { System.out.println(0.06+0.01); System.out.println(1.0-0.42); System.out.println(4.015*100); System.out.println(303.1/1000); } } 运行结果如下. 0.06999999999999999 0.58000000000000

详谈Java中BigDecimal的一个除法异常

如下所示: java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. 说明遇到除不尽的情况了,需要指定商的小数精度和舍入模式. 比如: a=b.divide(c,2,RoundingMode.HALF_UP); 以上这篇详谈Java中BigDecimal的一个除法异常就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

Java中BigDecimal精度和相等比较的坑

为什么要有BigDecimal ,他是干什么的 float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的.然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合.但是,商业计算往往要求结果精确,这时候就要使用BigDecimal啦. 什么是BigDecimal BigDecimal 由任意精度的整数非标度值 和32 位的整数标度 (scale) 组成.如果为零或正数,则标度是小数点后的

java中double转化为BigDecimal精度缺失的实例

java中double转化为BigDecimal精度缺失实例 @SuppressWarnings("static-access") public static void main(String[] args) { System.out.println(3215.10/2); BigDecimal bd = new BigDecimal(3215.10/2); System.out.println(bd); System.out.println(bd.setScale(2, bd.ROU

Java Bigdecimal使用原理详解

一般来说,一提到Java里面的商业计算,我们都知道不能用float和double,因为他们无法进行精确计算.但是Java的设计者给编程人员提供了一个很有用的类BigDecimal,他可以完善float和double类无法进行精确计算的缺憾. BigDecimal类位于java.maths类包下.首先我们来看下如何构造一个BigDecimal对象.它的构造函数很多,这里挑选最常用的两个来演示一下:一个就是BigDecimal(double val),另一个就是BigDecimal(String s

浅谈java中BigDecimal类的简单用法

一.BigDecimal概述 ​ Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数,但在实际应用中,可能需要对更大或者更小的数进行运算和处理.一般情况下,对于那些不需要准确计算精度的数字,我们可以直接使用Float和Double处理,但是Double.valueOf(String) 和Float.valueOf(String)会丢失精度.所以开发中,如果我们需要精确计算的结果,则必须使用

Java中BigDecimal的基本运算(详解)

BigDecimal一共有4个够造方法,让来看看其中比较常用的两种用法: 第一种:BigDecimal(double val) Translates a double into a BigDecimal. 第二种:BigDecimal(String val) Translates the String repre sentation of a BigDecimal into a BigDecimal. 使用BigDecimal要用String来够造,要做一个加法运算,需要先将两个浮点数转为Str

【Java】BigDecimal实现加减乘除运算代码

java.math.BigDecimal BigDecimal一共有4个够造方法,让我先来看看其中的两种用法: 第一种:BigDecimal(double val) Translates a double into a BigDecimal. 第二种:BigDecimal(String val) Translates the String repre sentation of a BigDecimal into a BigDecimal. 使用BigDecimal要用String来够造,要做一个

Java用BigDecimal解决double类型相减时可能存在的误差

double类型的两个数相减可能存在误差,比如System.out.println(2099 - 1999.9);的结果为99.09999999999991 可以用BigDecimal解决: public class TestDouble { //两个Double数相减 public static Double sub(Double d1, Double d2) { if (d1 == null || d2 == null) { return null; } BigDecimal b1 = ne

解决numpy矩阵相减出现的负值自动转正值的问题

问题描述 今天在使用Numpy中的矩阵做相减操作时,出现了一些本应为负值的位置自动转换为了正值, 观察发现转换后的正值为原本的负值加上256得到,具体情况如下: 正常情况矩阵相减样例如下 >>> import numpy as np >>> arr = np.array([98,100,103,161,192,210]) >>> brr = np.array([105,105,106,197,196,195]) >>> crr = a

java中double类型运算结果异常的解决方法

问题: 对两个double类型的值进行运算,有时会出现结果值异常的问题.比如: System.out.println(19.99+20); System.out.println(1.0-0.66); System.out.println(0.033*100); System.out.println(12.3/100); 输出: 39.989999999999995 0.33999999999999997 3.3000000000000003 0.12300000000000001 解决方法: J

mysql unsigned 用法及相减出现补数溢出解决方法

unsigned 既为非负数,用此类型可以增加数据长度! 例如如果 tinyint最大是127,那 tinyint unsigned 最大 就可以到 127 * 2 unsigned 属性只针对整型,而binary属性只用于char 和varchar. 类型 说明 tinyint 非常小的整数 smallint 较小整数 mediumint 中等大小整数 int 标准整数 bigint 较大整数 float 单精度浮点数 double 双精度浮点数 decimal 一个串的浮点数 每种数值类型的

程序中两个Double类型相加出现误差的解决办法

今天在自己做的系统中,发现了一个奇怪的现象:几个Double类型的数据相加,到最后得出的金额比正确数值总是少了几毛钱.以为是程序里的计算方法有问题,可是排查了很多地方,始终没有找到问题出在哪里.最后干脆把计算方法一句一句拆分,得到了最后最简单的一步,就是把两个具体的数值相加,但是最后的结果居然还是错误的.比如,现在已经到了最简单的一步: 复制代码 代码如下: double n = 171.6;double m = 28.17;double k = n + m; 按理说k的值应该是199.77,但

Java BigDecimal和double示例及相关问题解析

BigDecimal类 对于不需要任何准确计算精度的数字可以直接使用float或double,但是如果需要精确计算的结果,则必须使用BigDecimal类,而且使用BigDecimal类也可以进行大数的操作.BigDecimal类的常用方法如表1所示. 表1 BigDecimal类的常用方法 序号 方    法 类型 描    述 1 public BigDecimal(double val) 构造 将double表示形式转换 为BigDecimal 2 public BigDecimal(in

Java中BigDecimal类与int、Integer使用总结

前言 我们都知道浮点型变量在进行计算的时候会出现丢失精度的问题.如下一段代码: System.out.println(0.05 + 0.01); System.out.println(1.0 - 0.42); System.out.println(4.015 * 100); System.out.println(123.3 / 100); 输出: 0.060000000000000005 0.5800000000000001 401.49999999999994 1.23299999999999

Java编程BigDecimal用法实例分享

Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高精度计算. 其中 BigInteger 类是针对大整数的处理类,而 BigDecimal 类则是针对大小数的处理类. BigDecimal 类的实现用到了 BigInteger类,不同的是 BigDecimal 加入了小数的概念. float和Double只能用来做科学计算或者是工程计算;在商业计算中,对数字精度要求较高,必须使用 BigIn

java中BigDecimal进行加减乘除的基本用法

前言 众所周知Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数.在实际应用中,需要对更大或者更小的数进行运算和处理.float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal. BigDecimal所创建的是对象,我们不能使用传统的+.-.*./等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法. 方法中的参数也必须是B