财务精度:BigInteger 与 BigDecimal


每博一文案

师父说: 人这一辈子,真地好难。
有些人,好着好着,忽然就变陌生了,有些手,牵着牵着,瞬间就放开了,有些路,走着走着,就失去了方向了。
懵懵懂懂,一眨眼,我们就长大了,爱过的人,一转身,,青春就溜走了。以为有来日方长的,最后只剩人走茶凉。
以为能护你周全的,把你留给大风大浪。时光会老,爱会退潮,猜不透的,是人心,回不去,是从前。
从早晨到天黑,忙忙碌碌就是一天,从年初道年尾,辛辛苦苦就是一年。
为了家人,再苦也要咬牙奋斗,为了生活,再累也要微笑面对。
道不尽的,是付出,丢不掉的,是责任。人累了就休息,没有铁打的身体,心累了就放下,不是你的留不住。
一生很短,不要追得太多,心也有限,不必装太满。家不求奢华,只愿温馨和睦,
爱不求浪漫,只愿一生相伴。凡事看开了,烦恼就少了,人心看淡了,受伤就少了,
感情,大不了就是一聚一散,生活,大不了就是一起一落,相爱,有苦有甜才叫日子,心情,有起有落才叫人生。
愿你想开了就不必困惑,参透了就不用执着。
—————— 一禅心灵庙语


1. BigInteger

Integer 类作为 int 的包装类,能存储的最大整型值为 2^31-1,Long 类也是有限的,最大为 2^63-1。如果要表示再大的整数,不管是基本数据类型还是他们的包装类都无能为力,更不用说进行运算了。

java.math 包的 BigInteger 可以表示不可变的任意精度的整数。BigInteger 提供所有 java 的基本整数操作符的对应物,并提供 java.lang.Math 的所有相关方法。另外,BigInteger 还提供以下运算:模算术,GCD 计算,质数测试,素数生成,位操作以及一些其他操作。


一般使用 public BigInteger(String val) 构造器创建 Bigteger 对象


import java.math.BigInteger;

public class BigIntegerTest {
public static void main(String[] args) {
BigInteger bigInteger = new BigInteger("9999999999");
System.out.println(bigInteger); }
}


1.2 BigInteger 常用的方法

1.2.1  BigInteger 的 ”+“ add(), "-"subtract,"*" multiply,"/" divide

BigInteger  是引用数据类型,不是基本数据类型,是不可以直接使用 "+.-.*./" 这些算术运算符的,而是通过调用其对应的对象方法才行。

  • +   加 public BigInteger add(BigInteger val)
  • - 减 public BigInteger subtract(BigInteger val)
  • * 乘 public BigInteger multiply(BigInteger val)
  • / 除public BigInteger divide(BigInteger val)
  • 注意所传的参数 BigInteger 类型的才行的,以及是加减乘除后,返回一个新的 BigInteger 对象不是,在原本的基础上修改的
  • BigInteger 继承了 Number 类,其 Integer 也是继承了该 Number 类。

举例:

import java.math.BigInteger;

public class BigIntegerTest {
public static void main(String[] args) {
BigInteger bigInteger = new BigInteger("9999999999");
BigInteger bigInteger2 = new BigInteger("1"); BigInteger add = bigInteger.add(bigInteger2); // +
System.out.println(add); BigInteger subtract = bigInteger.subtract(bigInteger2); // -
System.out.println(subtract); BigInteger multiply = bigInteger.multiply(bigInteger2); // *
System.out.println(multiply); BigInteger divide = bigInteger.divide(bigInteger2); // /
System.out.println(divide); }
}

1.2.2 绝对值:abs()  ,取模:remainder() ,次方:pow()

public BigInteger abs(); // 返回其绝对值。
public BigInteger remainder(BigInteger val); // 返回其值为 (this % val) 的 BigInteger。
public BigInteger pow(int exponent); // 返回其值为 (thisexponent) 的 BigInteger。注意,exponent 是一个整数而不是 BigInteger。

同样的是运算后返回一个新的 BigInteger对象,不是在原来的基础上修改的

举例

import java.math.BigInteger;

public class BigIntegerTest {
public static void main(String[] args) {
BigInteger bigInteger = new BigInteger("-3");
BigInteger abs = bigInteger.abs(); // 绝对值
System.out.println(abs); BigInteger bigInteger2 = new BigInteger("2"); BigInteger remainder = bigInteger.remainder(bigInteger2); // 取模 %
System.out.println(remainder); BigInteger pow = bigInteger.pow(2); // 次方
System.out.println(pow);
}
}


2. BigDecimal

一般的 Float 类 和 Double 类可以用来左科学计算或工程计算,但在商业,财务,金融 计算中,要求的数字精度比较高,故用

java.math.BigDecimal 类。

因为 无论是 Float 类 还是 Dobule 类都存在精度问题。具体原因大家可以移步至:浮点数的精确度的探究_ChinaRainbowSea的博客-CSDN博客

你真的了解C语言 if - else 、bool(布尔值)、浮点数损失吗 ?_c11中有bool_ChinaRainbowSea的博客-CSDN博客

如下:

public class BigDoubleTest {
public static void main(String[] args) {
double num = 2.9999999999999999999998;
System.out.println(num);
}
}

BigDecimal类解决了这个,精度上的问题,并支持不可变的、任意精度的有符号十进制定点数。

常用的构造器两个

public BigDecimal(double val);  // 将 double 转换为 BigDecimal,后者是 double 的二进制浮点值准确的十进制表示形式。
public BigDecimal(String val); // 将 BigDecimal 的字符串表示形式转换为 BigDecimal

举例:

import java.math.BigDecimal;

public class BigDoubleTest {
public static void main(String[] args) {
double num = 2.9999999999999999999998;
System.out.println(num); // 精度问题; BigDecimal bigDecimal2 = new BigDecimal("2.9999999999999999999998");
System.out.println(bigDecimal2); }
}


2. 1 BigDecimal 常用的方法

2.1.1  BigDecimal 的 ”+“ add(), "-"subtract,"*" multiply,"/" divide

public BigDecimal add(BigDecimal augend);  // 返回一个 BigDecimal,其值为 (this + augend),其标度为 max(this.scale(), augend.scale())。
public BigDecimal divide(BigDecimal divisor,int scale,RoundingMode roundingMode) // 返回一个 BigDecimal,其值为 (this / divisor),其标度为指定标度。如果必须执行舍入,以生成具有指定标度的结果,则应用指定的舍入模式。
参数:
divisor - 此 BigDecimal 要除以的值。
scale - 要返回的 BigDecimal 商的标度。
roundingMode - 要应用的舍入模式。 public BigDecimal multiply(BigDecimal multiplicand); // 返回一个 BigDecimal,其值为 (this × multiplicand),其标度为 (this.scale() + multiplicand.scale())。 public BigDecimal subtract(BigDecimal subtrahend); // 返回一个 BigDecimal,其值为 (this - subtrahend),其标度为 max(this.scale(), subtrahend.scale())。

注意:  是不可变的,都是计算后返回一个新的BigDecimal 对象,不是在原来的基础上修改的。

举例;

import java.math.BigDecimal;

public class BigDoubleTest {
public static void main(String[] args) {
BigDecimal bigDecimal = new BigDecimal("2.9999999999999999999998");
BigDecimal add = bigDecimal.add(new BigDecimal("1")); // 加
System.out.println(add); BigDecimal subtract = bigDecimal.subtract(new BigDecimal(1)); // 减
System.out.println(subtract); BigDecimal multiply = bigDecimal.multiply(new BigDecimal(2)); // 乘
System.out.println(multiply); BigDecimal divide = bigDecimal.divide(new BigDecimal(2)); // 除
System.out.println(divide); }
}

这里特别说明一下 BigDecimal 的**除法**** 会 如果除不尽话,可以设置保留精度**

如果除数是 0 ,同样是会报算术异常的。

public BigDecimal divide(BigDecimal divisor,int scale, int roundingMode)

如下是: roundingMode 舍入的模式:说白了就是:四舍五入时的取舍规则,什么情况取,什么情况舍

举例:

import java.math.BigDecimal;

public class BigDoubleTest {
public static void main(String[] args) {
BigDecimal bigDecimal = new BigDecimal("2.9999999999999999999998");
BigDecimal bigDecimal2 = new BigDecimal(2); BigDecimal divide = bigDecimal.divide(bigDecimal2,6,BigDecimal.ROUND_FLOOR); // 除
System.out.println(divide);
}
}


3. 总结:

  1. BigDecimal 属于大数据,精度很高,不属于基本数据类型,属于java对象(引用数据类型)这是sun提供的一个类,专门用在财务软件当中。
  2. 注意: 财务软件中的double 是不够的,当处理财务数据时,用那一种类型 ?  千万不能用 double 要用 java.math.BigDecimal 中的类的这个对象
  3. 以及处理 Double 精度上的问题,使用 ``java.math.BigDecimal` 处理。
  4. 对于存储大的 Int 数值 使用 ``java.Math.BigInteger` 类 存储范围更大。
  5. 无论是 : BigDecimal  还是 BigInteger 都是引用类型,不是基本数据类型,对于 ”加减乘除“ 运算符,都不可以直接运算,而是通过 对于的方法进行了。”+“ add(), "-"subtract,"*" multiply,"/" divide。
  6. 无论是 : BigDecimal  还是 BigInteger 都是不可变的,其计算的结果都是,返回一个新的对象,不是在原来的基础上修改的。

4. 最后:

限于自身水平,其中存在的错误,希望大家给予指教,韩信点兵——多多益善,谢谢大家,江湖再见,后会有期 !!!


财务精度:BigInteger 与 BigDecimal的更多相关文章

  1. 拯救你丢失的精度——BigInteger和BigDecimal类(入门)

    第三阶段 JAVA常见对象的学习 BigInteger和BigDecimal类 BigInteger类 (一) 构造方法: //针对超过整数范围的运算(整数最大值:2147483647) BigInt ...

  2. Java 大数类BigInteger和BigDecimal的基本函数

    在Java中有两个类BigInteger和BigDecimal分别表示不可变的任意精度的整数和不可变的有符号的任意精度的十进制数(浮点数).主要用于高精度计算中.这两个类使得java中的大数,高精度运 ...

  3. BigInteger与BigDecimal

    BigInteger与BigDecimal Java大数字运算(BigInteger类和BigDecimal类) 在 Java 中提供了用于大数字运算的类,即 java.math.BigInteger ...

  4. Java-从Double类型精度丢失认识BigDecimal

    Java-从Double类型精度丢失认识BigDecimal 参考资料 https://www.jianshu.com/p/07e3eeb90f18 https://zh.wikipedia.org/ ...

  5. 【转】BigInteger、BigDecimal详解

    参考 http://lavasoft.blog.51cto.com/62575/228705/ 从Java4到Java5,Java对BigInteger.BigDecimal两个类功能一直再做扩展与改 ...

  6. Java 之 数学相关类 Math、BigInteger、BigDecimal

    一.java.lang.Math 类 一.Math 类概述 java.lang.Math 类包含用于执行基本数学运算的方法,如指数.对数.平方根和三角函数.类似于这样的类,其所有方法均为静态方法,并且 ...

  7. java常用类详细介绍及总结:字符串相关类、日期时间API、比较器接口、System、Math、BigInteger与BigDecimal

    一.字符串相关的类 1.String及常用方法 1.1 String的特性 String:字符串,使用一对""引起来表示. String声明为final的,不可被继承 String ...

  8. BigInteger和BigDecimal

    BigInteger BigInteger的作用是对整数做计算,一般的使用String类型初始化BigInteger,它除了封装了基本的加减乘除运算外还提供了signum(),abs()等函数,使用方 ...

  9. Day30 BigInteger和BigDecimal

    BigInteger与BigDecimal BigInteger类 Integer类作为int的包装类,能存储的最大整型值为2 31-1,Long类也是有限的, 最大为2 63-1.如果要表示再大的整 ...

  10. 经常使用的系统类Math、Arrays、System、BigInteger和BigDecimal以及日期类,时间戳

    一.Math 常用类: //看看Math常用的方法(静态方法)//1.abs绝对值int abs = Math . abs(-9);System. out . printLn(abs);//9//2. ...

随机推荐

  1. onps栈使用说明(3)——tcp、udp通讯测试

    4. tcp客户端 在协议栈源码工程下,存在一个用vs2015建立的TcpServerForStackTesting工程.其运行在windows平台下,模拟实际应用场景下的tcp服务器.当tcp客户端 ...

  2. K8Snode节点管理集群资源方法

    1.1 方法1 1.将master的admin.conf 文件拷贝到 node节点 [root@k8s-m ~]#scp /etc/kubernetes/admin.conf root@192.168 ...

  3. JSP利用AJAX实现页面即时校验验证码

    在JSP页面实现验证码校验文章中当时是使用的Servlet类来进行的验证码校验,但是这种方式并不能即时校验,在正常情况下都是直接在用户输入之后就进行校验,这样对用户来说很方便的. AJAX 即&quo ...

  4. CSP 记

    csp 开考建好文件夹编译器不能用搞了半天换了台电脑 四道题看完一个小时过去了 第一题不会正解写了部分分还有点悬 第二题写暴力因为一个小错误调了半天 看时间不多了已经有点慌了 也没想正解直接开了下一题 ...

  5. 移动 VR 开发时要避免的 PC 渲染技术

    更新:本文是为 Quest 1 开发人员编写的.虽然 Quest 2 建立在相同的架构上,但现在更容易为阴影贴图(以及其他需要从先前渲染过程中生成的纹理读取的简单技术)做预算. 尽管移动芯片组可以支持 ...

  6. 总算给女盆友讲明白了,如何使用stream流的filter()操作

    一.引言 在上一篇文章中<这么简单,还不会使用java8 stream流的map()方法吗?>分享了使用stream的map()方法,不知道小伙伴还有印象吗,先来回顾下要点,map()方法 ...

  7. 学习ASP.NET Core Blazor编程系列十五——查询

    学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...

  8. JavaEE Day08 HTML&CSS

    今日内容 HTML标签:表单标签 CSS:页面样式控制,美化页面,完成页面布局 一.表单标签 1.概述 用于采集用户输入数据的,如输入的用户名和密码,用于与服务器进行交互 使用from标签  form ...

  9. 【Shell案例】【awk匹配、grep查找文件内的字符串】6、去掉空行(删除空行)

    描述写一个 bash脚本以去掉一个文本文件 nowcoder.txt中的空行示例:假设 nowcoder.txt 内容如下:abc 567 aaabbb ccc 你的脚本应当输出:abc567aaab ...

  10. 【每日一题】【将cur的next尾插到pre后面,尾插k-1次】25. K 个一组翻转链表-211115&220120

    给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序. 进阶: 你可以设 ...