关于BigInteger和BigDecimal

news2025/7/19 19:11:29

BigInteger

  • BigInteger类是用于解决整形类型(含基本数据类型及对应的包装类,)无法表示特别大的数字及运算的问题,即使是占用字节数最多的整形long,能表示的范围也是有限的.
  • 理论上,你可以使用BigInteger表示任意整数
  • 基于java8中BigInteger的构造方法.
    在这里插入图片描述
    BigDecimal的构造方法2
    在这里插入图片描述
String value="777777733333322222999991111111999999933333399999999333333399999955555999995555";
BigInteger number=new BigInteger(value);

BigInteger的运算方式

  • 不可以使用运算符号处理BigInteger的运算
    • 本质上通过BigInteger类创建出来的是一个个对象,并不是数字,
  • 你必须通过BigInteger提供的Api实现需要的运算
    • 例如:public BigInteger add(BigInteger val)
import java.math.BigInteger;

public class BigIntegerDemo {
    public static void main(String[] args) {
        //下面的value已经超过了long的最大长度
        String value1="7777777777777777666666666666666644444444444444222222222222222";
        String value2="6666666666666666444444444444442222222222222221111111111000000";
        BigInteger number1=new BigInteger(value1);
        BigInteger number2=new BigInteger(value2);
        System.out.println(number1);
        System.out.println(number2);
        BigInteger result;

        result = number1.add(number2);
        System.out.println(result);

    }
}

BigInteger的常用API如下

在这里插入图片描述

import java.math.BigInteger;

public class BigIntegerDemo {
    public static void main(String[] args) {
        //下面的value已经超过了long的最大长度
        String value1="7777777777777777666666666666666644444444444444222222222222222";
        String value2="6666666666666666444444444444442222222222222221111111111000000";
        BigInteger number1=new BigInteger(value1);
        BigInteger number2=new BigInteger(value2);
        System.out.println(number1);
        System.out.println(number2);
        BigInteger result;
       //加法
        result = number1.add(number2);
        System.out.println(result);
       //减法
        result=number1.subtract(number2);
        System.out.println(result);

        //乘法
        result=number1.multiply(number2);
        System.out.println(result);

        //除法
        result=number1.divide(number2);
        BigInteger[] bigIntegers = number1.divideAndRemainder(number2);
        System.out.println(result);

        //除法并求余数
        //result2[0]是除法的结果   result2[1]是余数的结果
        BigInteger[] result2 = number1.divideAndRemainder(number2);
        System.out.println(result2);
        System.out.println("===============");
        System.out.println(result2[0]);
        System.out.println(result2[1]);

    }
}

将BigInteger转换成为基本类型

在这里插入图片描述
== 注意:在进行装换之前,应该明确是否会丢失精度,避免转换结果不符合预期==

BigInteger小结

  • 使用BigInteger可以表示非常大的整数
  • BigInteger的构造方法重载了几次,推荐使用String作为参数的那个
  • 当需要算术运算时,必须使用BigInteger提供的API
  • BigInteger的API几乎包括了你能想到的所有数值操作;
  • 你可以将BigInteger装换成任何基本数据类型,但可能丢失精度
    • 在装换之前,应先明确是否可能丢失精度
    • 你不一定需要将结果转装换为数值类型,是字符串也可以用于显示或存储

处理大数字的建议

在这里插入图片描述

关于BigDecimal

  • 使用float,double及其对应的包装类时,运算精度可能不满足需求
    • float最多只有7位有效数,则其精度为6~7位
    • double最多只有16位有效数,则其精度为15~16
  • 使用float,double及其对应的包装类时,不便于小数点以后的若干为进行截取,四舍五入或相关处理
import java.math.BigDecimal;
import java.math.BigInteger;

public class BigDecimalDemo {
    public static void main(String[] args) {
        //创建2个基本类型的浮点数
        double d1=0.1;
        double d2=0.2;
        //使用2个double求和的结果
        System.out.println(d1+d2);//0.30000000000000004


        //创建2个BigDecimal对象
        String s1="0.1";
        String s2="0.2";
        BigDecimal number1=new BigDecimal(s1);
        BigDecimal number2=new BigDecimal(s2);

        BigDecimal add = number1.add(number2);
        System.out.println(add);
    }
}

通过静态方法创建BigDecimal对象

在这里插入图片描述

import java.math.BigDecimal;
import java.math.BigInteger;

public class BigDecimalDemo {
    public static void main(String[] args) {
        //创建2个基本类型的浮点数
        double d1=0.1;
        double d2=0.2;
        //使用2个double求和的结果
        System.out.println(d1+d2);//0.30000000000000004


         //用它的静态方法valueOf()方法创建BigDecimal对象
        BigDecimal number3=BigDecimal.valueOf(d1);
        BigDecimal number4=BigDecimal.valueOf(d2);

        BigDecimal add1 = number3.add(number4);
        System.out.println(add1);
    }
}

我们看见BigDecimal还有如下的构造方法
在这里插入图片描述

import java.math.BigDecimal;
import java.math.BigInteger;

public class BigDecimalDemo {
    public static void main(String[] args) {
        //创建2个基本类型的浮点数
        double d1=0.1;
        double d2=0.2;
        //使用2个double求和的结果
        System.out.println(d1+d2);//0.30000000000000004


        //创建2个BigDecimal对象
        String s1="0.1";
        String s2="0.2";
        BigDecimal number1=new BigDecimal(s1);
        BigDecimal number2=new BigDecimal(s2);

        BigDecimal add = number1.add(number2);
        System.out.println(add);

//当原数使用double表示时,不要使用double作为构造方法的参数来创建BigDecimal对象.
        BigDecimal number5=new BigDecimal(d1);
        BigDecimal number6=new BigDecimal(d2);
        BigDecimal add2 = number5.add(number6);
        System.out.println(add2);//结果是不对的

        /**
         * 小结:当原数使用String表示时,使用构造方法创建BigDecimal对象
         * 当原数使用double表示时,使用静态valueOf()方法创建BigDecimal
         * 当原数使用double表示时,不要使用double作为构造方法的参数来创建BigDecimal对象.
         */
    }
}

小结

  • 当原数使用String表示时,使用构造方法创建BigDecimal对象
  • 当原数使用double表示时,使用静态valueOf()方法创建BigDecimal
  • 当原数使用double表示时,不要使用double作为构造方法的参数来创建BigDecimal对象.

BigDecimal常用的api

在这里插入图片描述
在这里插入图片描述

除法运算的roundingMode

  • 关于除法divide()方法,使用roundingMode可以设置运算时的舍入模式(是舍入模式,不是舍去模式)
  • 使用BigDecimal类中以Round为前缀的常量表示
    • 例如:BigDecimal.ROUND_HALF_UP
      在这里插入图片描述
import java.math.BigDecimal;
import java.math.BigInteger;

public class BigDecimalDemo {
    public static void main(String[] args) {
        //创建2个基本类型的浮点数
        double d1=0.13;
        double d2=0.234;
        //使用2个double求和的结果
        System.out.println(d1+d2);//0.30000000000000004


        //创建2个BigDecimal对象
        String s1="0.1";
        String s2="0.025";
        BigDecimal number1=new BigDecimal(s1);
        BigDecimal number2=new BigDecimal(s2);

        BigDecimal add = number1.add(number2);
        System.out.println(add)

        BigDecimal divide = number1.divide(number2);
        System.out.println(divide);

        BigDecimal divide1 = number1.divide(number2, BigDecimal.ROUND_UP);
        System.out.println(divide1);
    }
}

将BigDecimal转换为基本类型

在这里插入图片描述

BigDecimal小结

  • 使用BigDecimal主要解决基本数据类型运算精度不足的问题
  • 当原数使用String表示时,使用构造方法创建BigDecimal对象
  • 当原数使用double表示时,使用valueOf()静态方法创建BigDecimal对象
  • 当需要进行运算时,必须使用BigDecimal提供的API
  • BigDecimal的API几乎包括了你能想到的所有数据操作
  • 你可以将BigInteger装换成任何基本数据类型,单可能丢失精度
    • 在转换之前,应先明确是否可能丢失精度
    • 你不一定需要将结果转换为数值型,使用字符串也可以用于显示或存储.

处理高精度数据的建议

在这里插入图片描述

关于NumberFormat类

  • NumberFormat类是java.text包中的一个工具类,它主要作用是对数值进行格式化,得到期望格式的字符串.
    • 例如,当你期望将数字装换称为把粉笔格式时,输入0.37,将得到37%
    • 注意:只要对象的本质是数值,均可格式化
      + BingInteger,BigDecimal.String等
    • 格式化后得到的是StringBuffer对象
      + 一定程度上,你可以把StringBuffer直接理解为String
  • NumberFormat类是抽象类,不可以直接创建对象

预置的几种NumberFormat

  • 你可以通过NumberFormat的几个静态方法得到预置的NumberFormat对象
    在这里插入图片描述
import java.math.BigDecimal;
import java.text.NumberFormat;

public class NumberFormatDemo {
    public static void main(String[] args) {
        //将被格式化的数
        double value=95.32;
        BigDecimal number=BigDecimal.valueOf(value);

        //获取NumberFormat工具对象
        NumberFormat percentInstance = NumberFormat.getPercentInstance();
        NumberFormat currencyInstance = NumberFormat.getCurrencyInstance();

        //执行格式化
        String format = percentInstance.format(number);
        String format1 = percentInstance.format(value);
        System.out.println(format);
        System.out.println(format1);
        String format2 = currencyInstance.format(number);
        String format3 = currencyInstance.format(value);
        System.out.println(format2);
        System.out.println(format3);

        /**
         * 9,532%
         * 9,532%
         * ¥95.32
         * ¥95.32
         */


    }
}

关于Locale对象

  • 可以通过Locale的静态常量获取该类型对象,例如
    在这里插入图片描述
import java.math.BigDecimal;
import java.text.NumberFormat;
import java.util.Locale;

public class NumberFormatDemo {
    public static void main(String[] args) {
        //将被格式化的数
        double value=95.32;
        BigDecimal number=BigDecimal.valueOf(value);

        //获取NumberFormat工具对象.Locale.法国的,记住后面.的不一定是国家,它是地区.比如中国香港,和中国大陆是不一样的.
        NumberFormat currencyInstance = NumberFormat.getCurrencyInstance(Locale.FRANCE);

     
        String format2 = currencyInstance.format(number);
        String format3 = currencyInstance.format(value);
        System.out.println(format2);
        System.out.println(format3);


    }
}

小结

  • 使用NumberFormat 可以将数值格式化为特点的格式,包括
    • 数字
    • 整形数
    • 货币样式(可设置地区)
    • 百分比
  • 只要数据的本质是数值,都可以格式化
  • 先通过NumberFormat的静态方法获取对象,在调用format()方法即可得到格式化后的字符串
    • 根据期望目标格式,调用不同的方法
    • 得到的结果是StringBuffer对象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/37864.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java代码审计基础——RMI原理和反序列化利用链

目录 (一)何为RMI (二)、 RMI的模式与交互过程 0x01 设计模式 0x02 交互过程 0x03 Stub和Skeleton (三)简单的 RMI Demo 1、Server 2、Registry 3、Client 补充——动态类加载机制 几个函数 (…

Java集合框架详解(四)——Map接口、HashMap类、LinkedHashMap类

一、Map接口 Map接口的特点: (1)映射键值对的形式(key和value); (2)Map集合中,key是不能重复的,value是可以重复的; (3)…

解决报错:fatal: Authentication failed for ‘https://github.com/*/*.git/‘

目录 问题 解决 步骤一、 步骤二、 步骤三、 ​步骤四、 ​步骤五、 步骤六、 问题 今天创建一个 github 新仓库,首次上传本地代码时,遇到了一个报错。但是,之前这样操作肯定是没有问题的,毕竟我可以保证用户名和密码都是…

复杂环境下多移动机器人路径规划研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

数据结构 | 顺序栈与链式队【栈与队列的交际舞】

数据结构之栈与队列🌳顺序栈🍃前言🔥栈的结构简介及概述🔥为什么要用顺序栈?🔥结构声明🍃接口算法实现🍞初始化栈🍞销毁栈🍞入栈🍞出栈&#x1f3…

磨金石教育|干货分享:剪辑技法之跳切(上)

有一种剪辑手法划分了传统剪辑与现代剪辑的界限,它就是“跳切”; 跳切,是“切”的一种。属于一种无技巧的剪辑手法。它打破常规状态镜头切换时所遵循的时空和动作连续性要求,以较大幅度的跳跃式镜头组接,突出某些必要内…

【kafka】三、kafka命令行操作

kafka命令行操作 kafka的相关操作命令脚本文件在bin目录下 查看所有的topic kafka-topics.sh --zookeeper hll1:2181 --list 或 kafka-topics.sh --zookeeper 192.168.171.132:2181 --listkafka-topics.sh:topic执行脚本 --zookeeper hll1:2181:需要的…

[carla]把carla世界坐标系 转换为 俯视地图像素坐标系

在下面这篇参考博客中介绍了如何手动获取从carla世界坐标系到俯视地图像素坐标系的旋转平移矩阵.我也是采用了一样的思路和代码,这里把实现的过程以及最后所有地图的变换矩阵记录如下. 参考博客:carla真实世界坐标系与全局俯视地图像素坐标系变换 文章目录代码:1.carla世界坐标…

【表白】html表白代码

目录一.引言二.表白效果展示1.惊喜表白2.烟花表白3.玫瑰花表白4.心形表白5.心加文字6.炫酷的特效一.引言 我们可以用一下好看的网页来表白,下面就有我觉得很有趣的表白代码 下载整套表白文件 二.表白效果展示 1.惊喜表白 2.烟花表白 源码:新建一个文本文…

基于51单片机的温度控制系统数码管显示蜂鸣器报警proteus仿真原理图PCB

功能: 0.本系统采用STC89C52作为单片机 1.系统实时监测并显示当前温度,并通过四位数码管显示 2.超过设定阈值,蜂鸣器将报警,同时控制相应继电器实现降温或者加热 3.系统具备三个功能按键,可更改温度上限和下限 4.采用D…

SpringBoot+Mybatis-Plus+Thymeleaf 实现增删改查+登录/注册

SQL -- student_info create table if not exists student_info ( sid int not null auto_increment comment 学生表主键 primary key, sname varchar(20) not null comment 学生账号登录名、姓名, pwd varchar(32) not null comment 密码, sex varchar(20) not null comment …

AQS源码解析 7.共享模式_CyclicBarrier重复屏障

AQS源码解析 —共享模式_CyclicBarrier重复屏障 简介 CyclicBarrier:循环屏障、循环栅栏,用来进行线程协作,等待线程满足某个计数。构造时设置『计数个数』,每个线程执行到某个需要“同步”的时刻调用 await() 方法进行等待&…

【多目标进化优化】多目标进化群体的分布性

0 前言 \quad\quad进化算法是模拟生物自然进化的人工方法,与大自然生态环境一样,进化的物种也需要平衡发展。因此,设计者必须制定合适的生存规则来维持种群的多样性和分布性。在多目标进化算法中,对于某些问题,Pareto最…

微机-------可编程并行接口8255A

目录 8255A的内部结构8255A控制信息和传输动作的对应关系⭐8255A的控制字一、方式选择控制字①方式0(基本输入输出工作方式)二、端口C置1/置0控制字8255A的工作方式②方式1(选通的输入输出工作方式)③方式2(双向传输方式)⭐⭐8255的编程及应用8255A的内部结构 ①数据总线…

Steam项目推进(二)—— 在项目中使用FairyGUI

一、遇到的问题 昨天把代码大致清理了一遍之后,发现代码中存在很大的一个问题是数据和表现耦合在一起了,如下: using UnityEngine; using UnityEngine.UI;public enum CardStateType {InDeck, InHand, InBattle, InSave, InAbandon }//卡牌…

Cisco简单配置(十八)—OSPF

开放式最短路径优先(Open Shortest Path First,OSPF)是广泛使用的一种动态路由协议,它属于链路状态路由协议,具有路由变化收敛速度快、无路由环路、支持变长子网掩码(VLSM)和汇总、层次区域划分…

设计模式-组合模式(决策树)

一、只如初见 组合模式也许大家第一联想到的就是把两个模块组合起来使用,其实好像是这样也其实不是这样,废话不多说,学习一件新的事物总要先了解一下他的概念,老规矩先上概念(摘自百度百科): 组…

【活动预告】金融大数据治理实践分享(12/03)

原创 DAMA数据管理 # 本期主题 金融大数据治理实践分享 数字化时代,数据的价值受到越来越多的关注,有人将其比作黄金,也有人将其比作石油,成为组织中的最重要资产之一。针对数据这种有特殊属性的资产,也存在着采集…

[论文阅读] 颜色迁移-N维pdf迁移

[论文阅读] 颜色迁移-N维pdf迁移 文章: N-Dimensional Probability Density Function Transfer and its Application to Colour Transfer, [paper ][code] 1-算法原理 简单来说, 本文将图像看作是随机变量的一组样本, 图像之间的颜色迁移可以看作是样本之间分布的迁移. 因而…

G1D23-RAGA报名蓝桥Attackg安装cudatorch

昨天太摸鱼啦~不过蛮开心的哈哈 今天主要是把积累的ddl都清理一下!!!第一项就是我和舍友一起读的论文嘿嘿!! 一、RAGA (零)总结(仅模型) 作为数据挖掘顶会2021年的论文…