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

泛型星云
• 阅读 2381

第三阶段 JAVA常见对象的学习

BigInteger和BigDecimal类

BigInteger类

(一) 构造方法:
//针对超过整数范围的运算(整数最大值:2147483647)
BigInteger(String val)  
(二) 常用方法:
//加
public BigInteger add(BigInteger val)
//减
public BigInteger subtract(BigInteger val)
//乘
public BigInteger multiply(BigInteger val)
//除
public BigInteger divide(BigInteger val)
//返回商和余数的数组
public BigInteger[] divideAndRemainder(BigInteger val)    
import java.math.BigInteger;

public class BigIntegerDemo {
    public static void main(String[] args) {
        BigInteger bi1 = new BigInteger("100");
        BigInteger bi2 = new BigInteger("50");

        BigInteger[] bis = bi1.divideAndRemainder(bi2);
        System.out.println("商:" + bis[0]);
        System.out.println("余数:" + bis[1]);
    }
}

//运行结果
商:2
余数:0

BigInteger类

由于在运算的时候,float类型和double很容易丢失精度(下例为演示),所以为了能精确的表示、计算浮点数,Java提供了BigDecimal
public class BigDecimalDemo {
    public static void main(String[] args) {
        System.out.println(0.09 + 0.01);
        System.out.println(1.0 - 0.32);
        System.out.println(1.026 * 100);
        System.out.println(1.502 / 100);
        System.out.println(1.0 - 0.17);
    }
}

//运行结果
0.09999999999999999
0.6799999999999999
102.60000000000001
0.01502
0.83
(一) 构造方法:

我们来帖一组说明

BigDecimal
public BigDecimal(double val)

将double转换为BigDecimal ,这是double的二进制浮点值的精确十进制表示。

返回的BigDecimal是(10scale × val)是一个整数的最小值。

笔记:

  1. 这个构造函数的结果可能有些不可预测。 可以假设在Java中写入new BigDecimal(0.1)创建一个BigDecimal ,它完全等于0.1(非标尺值为1,比例为1),但实际上等于0.1000000000000000055511151231257827021181583404541015625。 这是因为0.1不能像double (或者作为任何有限长度的二进制分数)精确地表示。 因此,正在被传递给构造的值不是正好等于0.1,虽然表面上。
  2. 该String构造,在另一方面,是完全可以预测的:写new BigDecimal("0.1")创建BigDecimal这正好等于0.1,正如人们所期望的那样。 因此, 一般建议使用String constructor优先于此。
  3. 当double必须用作源为BigDecimal ,注意,此构造提供了一个精确的转换; 它不会将double转换为String使用Double.toString(double)方法,然后使用BigDecimal(String)构造函数相同的结果。 要获得该结果,请使用static valueOf(double)方法。
  • 参数

    val - double值转换为 BigDecimal 。

  • 异常

    NumberFormatException - 如果 val 是无限或NaN。

构造方法:建议使用 → BigDecimal(String s)

(二) 常用方法:
import java.math.BigDecimal;

public class BigDecimalDemo2 {
    public static void main(String[] args) {
        BigDecimal bd1 = new BigDecimal("0.09");
        BigDecimal bd2 = new BigDecimal("0.01");
        System.out.println("加:" + bd1.add(bd2));

        BigDecimal bd3 = new BigDecimal("1.0");
        BigDecimal bd4 = new BigDecimal("0.32");
        System.out.println("减:" + bd3.subtract(bd4));

        BigDecimal bd5 = new BigDecimal("1.026");
        BigDecimal bd6 = new BigDecimal("100");
        System.out.println("乘:" + bd5.multiply(bd6));

        BigDecimal bd7 = new BigDecimal("1.502");
        BigDecimal bd8 = new BigDecimal("100");
        System.out.println("除:" + bd7.divide(bd8));
    }
}

//运行结果
加:0.10
减:0.68
乘:102.600
除:0.01502

结尾:

如果内容中有什么不足,或者错误的地方,欢迎大家给我留言提出意见, 蟹蟹大家 !^_^

如果能帮到你的话,那就来关注我吧!(系列文章均会在公众号第一时间更新)

在这里的我们素不相识,却都在为了自己的梦而努力 ❤

一个坚持推送原创Java技术的公众号:理想二旬不止

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

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
java 大数基本操作
导言:  计算机中数字的表示范围是有一定的限制的,像Java中,常用的数据类型,如int、double等数据类型表示的范围都是有限的,当我们要计算的数字,其位数达到成百上千时,这些数据类型无法满足我们的需求,C语言中我们可以使用数组来储存位数,再对两个数组进行相应的运算;Java中为了处理大整数的运算,提供了一种数据类型:BigInteger,BigDe
Wesley13 Wesley13
3年前
java.math.BigDecimal类的用法
在java中提供了大数字的操作类,即java.math.BinInteger类和java.math.BigDecimal类。这两个类用于高精度计算,其中BigInteger类是针对大整数的处理类,而BigDecimal类则是针对大小数的处理类。下边我们介绍BigDecimal类:BigDecimal的实现利用到了BigInteger,不同的是Big
Wesley13 Wesley13
3年前
Java:利用BigDecimal类巧妙处理Double类型精度丢失
本篇要点简单描述浮点数十进制转二进制精度丢失的原因。介绍几种创建BigDecimal方式的区别。整理了高精度计算的工具类。学习了阿里巴巴Java开发手册关于BigDecimal比较相等的规定。经典问题:浮点数精度丢失精度丢失的问题是在其他计算机语言中也都会出
Wesley13 Wesley13
3年前
Java中BigDecimal的8种舍入模式
java.math.BigDecimal不可变的、任意精度的有符号十进制数。BigDecimal由任意精度的整数非标度值和32位的整数标度(scale)组成。如果为零或正数,则标度是小数点后的位数。如果为负数,则将该数的非标度值乘以10的负scale次幂。因此,BigDecimal表示的数值是(unsc
Wesley13 Wesley13
3年前
Java开发笔记(三十)大小数BigDecimal
前面介绍的BigInteger只能表达任意整数,但不能表达小数,要想表达任意小数,还需专门的大小数类型BigDecimal。如果说设计BigInteger的目的是替代int和long类型,那么设计BigDecimal的目的便是替代浮点型float和双精度型double了。正如它的兄弟BigInteger一般,BigDecimal不存在什么数值范围限制,无论是
Wesley13 Wesley13
3年前
JDK8 BigDecimal API
第三篇先介绍以BigInteger为构造参数的构造器1publicBigDecimal(BigIntegerval){//根据BigInteger创建BigDecimal对象2scale0;//BigInteger为整数因此有效小数位数为03intVal
Stella981 Stella981
3年前
BigDecimal和BigInteger
在看《阿里巴巴开发手册》里面提到浮点数之间的等值判断不要用,而是指定误差范围或用BigDecimal,然后才记忆起备忘录里BigDecimal还没写呢,就这篇幅写了一星期,因为实习完全没有时间啊啊啊啊啊啊啊啊1\.BigDecimal介绍背景我们知道计算机
Wesley13 Wesley13
3年前
Java生成十六进制的MD5加密字符串
importjava.math.BigInteger;importjava.security.MessageDigest;importjava.security.NoSuchAlgorithmException;/@authorjoymufeng/public
Stella981 Stella981
3年前
20165305 苏振龙《Java程序设计》第六周学习总结
第八章知识点熟练掌握String类的常用方法。掌握String类的和StringBuffer类的不同,以及二者之间的联系。使用StringTokenizer,Scannner类分析字符串,获取字符串中被分隔符分隔的单词。掌握Date类和Calendar类获取时间和日期的用法。如果需要处理特别大的整数,使用BigInteger类。当需要
可莉 可莉
3年前
20165305 苏振龙《Java程序设计》第六周学习总结
第八章知识点熟练掌握String类的常用方法。掌握String类的和StringBuffer类的不同,以及二者之间的联系。使用StringTokenizer,Scannner类分析字符串,获取字符串中被分隔符分隔的单词。掌握Date类和Calendar类获取时间和日期的用法。如果需要处理特别大的整数,使用BigInteger类。当需要
智多星V+TNY264278 智多星V+TNY264278
11个月前
Java常用API(BigInteger)
在Java中,整数有四种类型:byte,short,int,long在底层占用字节个数:byte1个字节,short2个字节,int4个字节,long8个字节对象一旦创建,里面的值是不能改变的。1.随机获取一个最大整数RandomrnewRandom();