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


    第三阶段 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技术的公众号:理想二旬不止

    img

  • 相关阅读:
    js数组的基本用法及数组根据下标(数值或字符)移除元素
    Oracle备份一张表
    linux中常见的文件操作命令
    java图片二进制相互转换
    getParameterMap的使用
    前端常用
    Oracle 常用
    JAVA中int、String的类型转换
    MySQL 5.7 新特性大全和未来展望
    你有自己的Web缓存知识体系吗?
  • 原文地址:https://www.cnblogs.com/ideal-20/p/11050077.html
Copyright © 2020-2023  润新知