BigInteger 和BigDecimal
出处:为什么会想到大数呢?是因为最近在写leetcode刷题的时候钻牛角尖非要实现数组加1的问题导致的。(leetcode 66 加1问题)不过ps自己对大数还是用的少了,导致害怕用,然后leetcode用了还报错。(这个自己感觉代码没问题估计不让用吧)
BigInteger (大整数)
这个类主要就是为了长度过长超过long整数基本类型而生产出来的,它的内部源码可以简单看一下变量就一目了然。
final int signum; // 符号标志, -1 : 负数, 0 : 零, 1 : 正数final int[] mag; // 存放大整数二进制位的数组, 大端存储/*** 下面的变量都是为了懒求值而设置的, 暂时不用管.* 所谓懒求值是指当用到的时候才求值;*** 而求过之后由于BigInteger是不可变的, * 这些所求也不会变, 所以就利用变量存下,* 当第二次求这些的时候, 直接返回即可;*** 之所以存放这些值+1或+2(plusOne plusTwo),* 是为了方便判断是否被求过.*/
private int bitCountPlusOne;
private int bitLengthPlusOne;
private int lowestSetBitPlusTwo;
private int firstNonzeroIntNumPlusTwo;
通过源码的查看了解到它的底层使用了int数组来实现,而int数组来讲可以实现几乎无限长,而一个int类型是有32位,可想而知很大,注意到它跟String一样很特殊里面使用final修饰说明不可修改,只能利用里面分装好的方法进行操作也有着一定局限性,那么用到的时候也很简单跟着以下方法目录进行调用就可以啦。
这边就做个方法链接:https://www.w3schools.cn/javamath/java_math_biginteger.asp
BigDecimal(大浮点数)
首先介绍为什么浮点数 float 或 double 运算的时候会有精度丢失的风险?
一句话概括就是因为计算机二进制表示时会宽度不够小数被截断导致了精度的丢失。
通常情况下,大部分需要浮点数精确运算结果的业务场景(比如涉及到钱的场景)都是通过 BigDecimal 来做的。
源码中几个重要属性
// 若BigDecimal的绝对值小于Long.MAX_VALUE,放在这个变量中
//public static final long MIN_VALUE = 0x8000000000000000L;
private final transient long intCompact;
//BigDecimal的标度(小数点),
//输入数除以10的scale次幂(32 位的整数标度)
private final int scale;
// BigDecimal的未scale的值,BigInteger是
// 一个任意长度的整数(整数非标度值)
private final BigInteger intVal;
// BigDecimal的精度(精度是非标度值的数字个数)
private transient int precision;
//toString后缓存
private transient String stringCache;
可以很熟悉看到它基于BigInteger 实现。
这边注意详细想看一下源码解析的地址哦!说不定有惊喜想法呢?https://zhuanlan.zhihu.com/p/339905119我从这里面了解到这么重要一个小点。
BigDecimal坑
- double 参数的构造方法,不允许使用!!!因为它不能精确的得到相应的值;
- String 构造方法是完全可预知的: 写入 new BigDecimal(“0.1”) 将创建一个 BigDecimal,它正好等于预期的0.1; 因此,通常建议优先使用 String 构造方法;
- 静态方法 valueOf(double val) 内部实现,仍是将 double 类型转为 String 类型; 这通常是将 double(或float)转化为 BigDecimal 的首选方法;
做个方法链接:https://www.w3schools.cn/javamath/java_math_bigdecimal.html
BigInteger 和BigDecimal相关推荐
- BigInteger和BigDecimal类
要点提示: BigInteger和BigDecimal类可以用于表示任意大小和精度的整数或者十进制数. 如果要进行非常大的数的计算或者高精度浮点值的计算,可以使用java.math包中的BigInte ...
- Java 大数类BigInteger与BigDecimal详细介绍(配蓝桥杯例题讲解)
文章目录 1.基本函数 1.1 java.math.BigInteger.valueOf(long val) 2.运算法则 2.1 基本运算 2.2 compareTo(BigInteger othe ...
- Java5:BigInteger、BigDecimal详解
从Java4到Java5,Java对BigInteger.BigDecimal两个类功能一直再做扩展与改进.主要原因是这两个数据类型很重要,在高精度的计算中全靠这两个数据类型了.BigInteger和 ...
- java之包装类与BigInteger、BigDecimal
一.包装类 (1)包装类与原类型 Integer int 的包装类 Boolean boolean 的包装类 Character ...
- Java常用类(5)--不可变的任意精度BigInteger、BigDecimal类
文章目录 BigInteger类 BigDecimal类 BigInteger类 Integer类作为int的包装类,能存储的最大整型值为2^31-1,Long类也是有限的, 最大为2^63-1.如果 ...
- java中大数字表示什么_JAVA中大数字的的处理:BigInteger和BigDecimal
关键技术剖析: ² BigInteger:支持任意精度的整数,可以精确地表示任意大小的整数值,同时在运算过程中不会丢失任何信息. ² BigDecimal:可以精确地表示任意精度的小数,同时在运算过程 ...
- Java番外篇4——BigInteger与BigDecimal
Java番外篇4--BigInteger与BigDecimal 为了解决大数运算的问题 操作整型:BigInteger 操作小数:BigDecimal 1.BigInteger 方法声明 功能介绍 p ...
- Java篇 - 最全BigInteger和BigDecimal实战
最近公司在做一款区块链钱包,区块链上传输的数值都是很大的,大到几十位.用Java的基本类型是处理不了的,int占32位,long.double占64位,如果用这些基本数据类型运算的话,第一是存储不了这 ...
- java bigdecimal.valueof_java 中的大數據類型(BigInteger和BigDecimal) | 學步園
一.為什麼為用到BigInteger和BigDecimal這種數據類型呢? 我們非常清楚,java裡面整型int與浮點型float,double它們存放數據的範圍是有邊界的.那麼如果需要更大的數據時, ...
- Java大数据BigInteger和BigDecimal
BigInteger和BigDecimal是以方法调用方式取代运算符方式来实现,等于是用速度换取了精度. BigInteger(长整数) BigInteger的常量 常量名称 常量含义 BigInte ...
最新文章
- 广东省“安网2016”网络安全专项治理行动正式启动
- nrf52840开发套件_nRF52840蓝牙5.0模块有几个突出的优势
- Scott Mitchell 的ASP.NET 2.0数据教程之十一: 基于数据的自定义格式化
- 想了解Sleuth+zipkin分布式请求链路追踪,来看看这篇文章吧!
- 10-1 5-1 查询销售便携式电脑但不销售PC的厂商 (20 分)(分析+详解)
- java俄罗斯方块旋转,俄罗斯方块旋转算法研究
- idea升级2019.3后字体有的粗有的细
- 走进 Growth Hacker 的世界
- response.contenttype
- 不胜唏嘘!衰落的苹果与崛起的荣耀
- kali linux2019镜像下载,Kali 2019下载_KaLi Linux镜像文件iso下载 2019.1a x86/x64_当载软件站...
- 10mbps 局域网组播_80211 组播速率及组播转单播
- 通过LNK文件(快捷方式)解析出目标文件的路径
- 【CAD】多段线的合并与闭合的操作与测试
- 订单可视化(智能制造、流程再造、企业信息化) 第七篇 经营班子掌舵,业务与开发分离,走向成功必备条件
- 学环境工程我后悔了_环境工程学出来能干啥
- HTML九宫格-表格面板
- Apollo学习笔记(22)Dijkstra算法
- 生命是罐头,胆量是开罐器
- 田忌赛马java lms_【044】:田忌赛马