BigInteger和BigDecimal的使用

2023-11-01

1. BigInteger类的常用方法

  • java.math.BigInteger类表示一个超大的整数,而且支持任意精度整数的四则运算(加减乘除)。

  • 常用方法

方法 含义
public BigInteger(String val) BigInteger 的十进制字符串表示形式转换为 BigInteger。
public BigInteger add(BigInteger val) 返回其值为 (this + val) 的 BigInteger
public BigInteger subtract(BigInteger val) 返回其值为 (this - val) 的 BigInteger
public BigInteger multiply(BigInteger val) 返回其值为 (this * val) 的 BigInteger
public BigInteger divide(BigInteger val) 返回其值为 (this / val) 的 BigInteger
package date_3_23;

import org.junit.Test;
import java.math.BigInteger;

public class BigIntegerTest {

    /**
     * 测试 int 和 long 的取值范围
     */
    @Test
    public void testIntLongLimit() {
        int intMaxValue = Integer.MAX_VALUE;
        System.out.println("int表示的最大范围" + intMaxValue); // 2147483647

        long longMaxValue = Long.MAX_VALUE;
        System.out.println("long表示的最大范围" + longMaxValue); // 9223372036854775807

    }

    /**
     * BigInteger 构造方法的使用
     */
    @Test
    public void testBigIntegerConstructor() {
        BigInteger bigInteger = new BigInteger("92233720368547758079223372036854775807");
        String data = bigInteger.toString();
        System.out.println(data); // 92233720368547758079223372036854775807
        
        System.out.printf("%s",bigInteger); // 92233720368547758079223372036854775807
    }

    /**
     * 使用 BigInteger 完成两个超大整数的加法运算
     */
    @Test
    public void testBigIntegerAdd() {
        BigInteger left = new BigInteger("92233720368547758079223372036854775807");
        BigInteger right = new BigInteger("10000000000000000000000000000000000000");
        BigInteger addResult = left.add(right);
        System.out.printf("%s + %s = %s\n", left, right, addResult);
        // 92233720368547758079223372036854775807 + 10000000000000000000000000000000000000 = 102233720368547758079223372036854775807
    }

    /**
     * 使用 BigInteger 完成两个超大整数的减法运算
     */
    @Test
    public void testBigIntegerSubtract() {
        BigInteger left = new BigInteger("92233720368547758079223372036854775807");
        BigInteger right = new BigInteger("10000000000000000000000000000000000000");
        BigInteger addResult = left.subtract(right);
        System.out.println(addResult);
        // 82233720368547758079223372036854775807
    }

    /**
     * 使用 BigInteger 完成两个超大整数的乘法运算
     */
    @Test
    public void testBigIntegerMultiply() {
        BigInteger left = new BigInteger("92233720368547758079223372036854775807");
        BigInteger right = new BigInteger("10000000000000000000000000000000000000");
        BigInteger addResult = left.multiply(right);
        System.out.println(addResult);
        //922337203685477580792233720368547758070000000000000000000000000000000000000
    }

    /**
     * 使用 BigInteger 完成两个超大整数的除法运算
     */
    @Test
    public void testBigIntegerDivide() {
        BigInteger left = new BigInteger("92233720368547758079223372036854775807");
        BigInteger right = new BigInteger("10000000000000000000000000000000000000");
        BigInteger addResult = left.divide(right);
        System.out.println(addResult); // 9
    }
}
  • BigInteger 没有对应的基本数据类型,但是它提供了方法来转换对应的基本数据类型。
public class BigIntegerTest {    
	/**
     * BigInteger 的类型转化
     */
    @Test
    public void testBigIntegerTypeConversion() {
        BigInteger left = new BigInteger("92233720368547758079223372036854775807");
        BigInteger right = new BigInteger("10000000000000000000000000000000000000");
        BigInteger divideResult = left.divide(right);
        System.out.println(divideResult); // 9

        int intValue = divideResult.intValue();
        System.out.println("intValue = " + intValue);

        long longValue = divideResult.longValue();
        System.out.println("longValue = " + longValue);
    }
}

2. BigDecimal 类常用方法的使用

  • 浮点数在计算的时候可能有精度问题的,在日常开发中,如果有浮点数的运算,禁止使用 float 或者 double,这是由于浮点数在内存中的存储机制导致的。
    /**
     * 浮点数的精度问题
     */
    @Test
    public void testFloatPrecision(){
        System.out.println(1.0 - 0.1); // 0.9
        System.out.println(1.0 - 0.32); // 0.6799999999999999
    }
  • java.math.BigDecimal 正是为了解决浮点数运算的精度问题,它可以表示任意精度的浮点数。

  • 常用方法

方法 含义
public BigDecimal(String val) BigDecimal 的字符串表示形式转换为 BigDecimal
public BigDecimal add(BigDecimal augend) 返回一个 BigDecimal,其值为 (this + augend)。
public BigDecimal subtract(BigDecimal subtrahend) 返回一个 BigDecimal,其值为 (this - subtrahend)。
public BigDecimal multiply(BigDecimal multiplicand) 返回一个 BigDecimal,其值为 (this × multiplicand)
public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode) 返回一个 BigDecimal,其值为 (this / divisor),其标度为指定标度。如果必须执行舍入,以生成具有指定标度的结果,则应用指定的舍入模式
import org.junit.Test;
import java.math.BigDecimal;
import java.math.RoundingMode;

public class BigDecimalTest {

    /**
     * 浮点数的精度问题
     */
    @Test
    public void testFloatPrecision(){
        System.out.println("1.0 - 0.1 = " + (1.0-0.1)); // 1.0 - 0.1 = 0.9
        System.out.println("1.0 - 0.32 = "+ (1.0-0.32));
        // 1.0 - 0.32 = 0.6799999999999999
    }

    /**
     * !!! 错误的构造方法
     * 在使用 BigDecimal的构造方法创建 BigDecimal 时千万不能传 double 类型的数据,
     * 否则即使使用 BigDecimal 做运算, 一样会有精度问题。
     */
    @Test
    public void testBigDecimalConstructorDouble(){
        BigDecimal left = new BigDecimal(1.0);
        BigDecimal right = new BigDecimal(0.32);

        BigDecimal subtractResult = left.subtract(right);

        System.out.printf("%s - %s = %s",left,right,subtractResult);
        // 1 - 0.320000000000000006661338147750939242541790008544921875 = 0.679999999999999993338661852249060757458209991455078125
    }

    /**
     * 正确的构造方法!!!
     * 应该使用 String 类型的数据 作为构造方法的参数,这样运算就不会有精度问题
     */
    @Test
    public void testBigDecimalConstructorString(){
        BigDecimal left = new BigDecimal("1.0");
        BigDecimal right = new BigDecimal("0.32");

        BigDecimal subtractResult = left.subtract(right);

        System.out.printf("%s - %s = %s",left,right,subtractResult);
        // 1.0 - 0.32 = 0.68
    }


    /**
     * BigDecimal 的除法运算
     */
    @Test
    public void testBigDecimalDivide(){
        BigDecimal left = new BigDecimal("10.0");
        BigDecimal right = new BigDecimal("3.0");

        /**
         * BigDecimal divideResult = left.divide(right);
         * 当除不尽的时候会发生算数异常 ArithmeticException
         */

        /**
         * scale 2 表示小数点后保留2位
         * RoundingMode.HALF_UP 表示四舍五入
         */
        BigDecimal divideResult = left.divide(right, 20,RoundingMode.HALF_UP);
        System.out.printf("%s / %s = %s",left,right,divideResult);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BigInteger和BigDecimal的使用 的相关文章

  • 《STL源码剖析》学习笔记2——神奇的__type_traits

    标签 C C STL 学习 笔记 在STL中为了提供通用的操作而又不损失效率 我们用到了一种特殊的技巧 叫traits编程技巧 具体的来说 traits就是通过定义一些结构体或类 并利用模板类特化和偏特化的能力 给类型赋予一些特性 这些特性
  • java学习笔记13--反射机制与动态代理

    本文地址 http www cnblogs com archimedes p java study note13 html 转载请注明源地址 Java的反射机制 在Java运行时环境中 对于任意一个类 能否知道这个类有哪些属性和方法 对于任
  • 浏览器有哪些进程?浏览器进程,渲染进程,网络进程,渲染进程有哪些线程?

    浏览器进程 渲染进程有哪些线程 在浏览器中打开两个页面 会开启几个进程 1个浏览器进程 1个网络进程 一个GPU进程 通常一个Tab页对应一个渲染进程 但有其它情况 1 如果页面中有iframe的话 iframe也会运行在单独的进程中 2
  • 第一次 openwrt源码下载编译

    openwrt 学习记录 第一次 openwrt源码下载编译 MT7620开发板 安装虚拟机VMware 安装Ubnutu 先进入root账户 topeet ubuntu su 输入密码 1 搭建编译环境 参考 https blog csd
  • QT在子线程发送信号给主线程,主线程信号槽函数没有反应的解决办法

    在编写线程时遇到了一个问题 即子线程发送信号给主线程 主线程信号槽函数没有反应 这个问题卡了半天 最终找到解决办法 自己记录一下 问题 在子线程的run函数发送了一个信号 在主函数中定义了一个信号槽函数用来响应这个信号 但是槽函数不执行 修
  • 学习笔记-Spark环境搭建与使用

    一 20 04 Ubuntu安装 清华源ISO源 https mirrors tuna tsinghua edu cn ubuntu releases 20 04 下载链接 https mirrors tuna tsinghua edu c
  • C++ STL概述

    STL就是封装好的一些数据结构以及一些算法 C STL 标准模板库 是一套功能强大的 C 模板类 提供了通用的模板类和函数 这些模板类和函数可以实现多种流行和常用的算法和数据结构 如向量 链表 队列 栈 Standard Template
  • 关于Mysql线程的基本设置

    客户端发起连接到mysql server mysql server监听进程 监听到新的请求 然后mysql为其分配一个新的 thread 去处理此请求 从建立连接之开始 CPU要给它划分一定的thread stack 然后进行用户身份认证
  • Kerberos

    kerberos身份认证过程 第一步 账号和KDC互相认证 账号A向KDC证明自己的身份 1 账号A首先会把自己的密码hash 得到一把秘钥Kclt 2 Kclt会把当前的时间戳加密 生成一个字符串 使用 时间戳 Kclt来表示 3 将生成
  • Matlab导出动态链接库dll

    1 新建 m文件 内容 function c Add a b c a b end 保存为 Add m 2 命令行输入 gt gt mex setup MEX configured to use Microsoft Visual C 2013
  • 2022全国职业技能大赛-网络安全赛题解析总结④(超详细)

    2022全国职业技能大赛 网络安全赛题解析总结 自己得思路 模块A 基础设施设置与安全加固 20分 模块B 网络安全事件响应 数字取证调查和应用安全 40分 模块C CTF夺旗 攻击 20分 模块D CTF夺旗 防御 20分 有什么不懂得可
  • centos7 Jumpserver堡垒机部署以及使用详情

    一 跳板机 堡垒机的概念 1 跳板机 跳板机就是一台服务器 运维人员在使用管理服务器的时候 必须先连接上跳板机 然后才能去操控内网中的服务器 才能登录到目标设备上进行维护和操作 跳板机的缺点 仅仅实现服务器登录安全 但是没有实现对于运维人员
  • 【学习笔记】开源中文对话预训练模型调研总结

    开源中文对话预训练模型调研 文章目录 开源中文对话预训练模型调研 1 CDial GPT 主要工作 LCCC数据集 数据清洗策略 基于规则的清洗 基于分类器的清洗 模型 输入表征 训练 2 GPT2 chitchat 3 EVA1 0 WD
  • JavaEE学习记录day11 IO流02 字符流、转换流、Properties集合

    1 字符流 1 1为什么会出现字符流 理解 字符流的介绍 由于字节流操作中文不是特别的方便 所以Java就提供字符流 字符流 字节流 编码表 中文的字节存储方式 用字节流复制文本文件时 文本文件也会有中文 但是没有问题 原因是最终底层操作会
  • MyBatis学习笔记整理详细

    MyBatis笔记 写在前面 欢迎来到 发奋的小张 的博客 我是小张 一名普通的在校大学生 在学习之余 用博客来记录我学习过程中的点点滴滴 也希望我的博客能够更给同样热爱学习热爱技术的你们带来收获 希望大家多多关照 我们一起成长一起进步 也
  • 不在傻傻for循环!完美解决JPA批量插入问题

    前言 jpa在简单的增删改查方面确实帮助我们节省了大部分时间 但是面对复杂的情况就显得心有余而力不足了 最近遇到一个批量插入的情况 jpa虽然提供了saveAll方法 但是底层还是for循环save 如果遇到大量数据插入频繁与数据库交互必然
  • 一文图解 Transformer,小白也看得懂(完整版)

    原作者 Jay Alammar 原链接 https jalammar github io illustrated transformer 1 导语 谷歌推出的 BERT 模型在11项NLP任务中夺得SOTA结果 引爆了整个NLP界 而BER
  • C 库函数 - gmtime()

    描述 C 库函数 struct tm gmtime const time t timer 使用 timer 的值来填充 tm 结构 并用协调世界时 UTC 也被称为格林尼治标准时间 GMT 表示 声明 下面是 gmtime 函数的声明 st
  • C 库函数 - mktime()

    描述 C 库函数 time t mktime struct tm timeptr 把 timeptr 所指向的结构转换为自 1970 年 1 月 1 日以来持续时间的秒数 发生错误时返回 1 声明 下面是 mktime 函数的声明 time
  • 监控显卡显存(python代码)

    一 前言 我和我同学的代码 分别占用14G显存 而显卡的显存只有24G 没有办法同时跑 所以 他先跑 我的代码时刻监控显存的使用情况 只要显卡显存大于14G 我的代码就自动启动 二 代码 import pynvml import time

随机推荐

  • RuntimeError: cuDNN error: CUDNN_STATUS_NOT_SUPPORTED.

    原因 batch size太大了 说起来我也觉得挺奇怪 bs太大为什么不报错out of memory而是报了这么一个牛头不对马嘴的错误 不过因为我这个环境已经跑了很多模型都没有问题 因此不是cudnn和cuda版本对应问题 将bs调小一半
  • 常用Linux发行版镜像源配置

    最近研究Linux 试了一些Linux发行版 但是大多数发行版的软件源速度都不是很理想 所以我这里干脆做了一个收集 把我用过的一些常用发行版的软件源设置方法做个总结 大家也可以做个参考 Ubuntu 18 04 18 04是目前Ubuntu
  • unity Animation和Animator动画的暂停和继续播放

    1 利用Animator组件实现暂停和继续播放自己创建的Animation动画 需要按以下顺序操作 在需要播放动画的物体身上添加Animator组件 在Project视图下创建AnimatorController并拖入到Animator组件
  • 【vue3+ts+ant】a-table的column绑定点击事件的两种方式

    需求 给标题这一列的数据绑定点击事件 实现交互 第一种 在dom里面插入标签 并绑定点击事件
  • 【牛客网 - 华为机试 - HJ85 最长回文子串】

    描述 给定一个仅包含小写字母的字符串 求它的最长回文子串的长度 所谓回文串 指左右对称的字符串 所谓子串 指一个字符串删掉其部分前缀和后缀 也可以不删 的字符串 数据范围 字符串长度 进阶 时间复杂度 O n O n 空间复杂度 O n O
  • Java编码规范

    目录 1 代码规范 2 1 1 注释规范 2 1 1 1 页头注释
  • redux之react-redux实现原理

    Redux Flow 一 介绍 一 redux 1 reducer念 reducer就是一个纯函数 接收旧的state和action 返回新的state previousState action gt newState 名字由来 Array
  • Java 实现下载文件工具类

    package com liunian utils import lombok SneakyThrows import javax servlet ServletOutputStream import javax servlet http
  • 力扣每日一题——四数相加Ⅱ

    题目链接 class Solution public 将四个组分为两组 即时间复杂度n 4 gt 2 n 2 int fourSumCount vector
  • 服务器域名修改,服务器修改域名

    服务器修改域名 内容精选 换一换 华为云帮助中心 为用户提供产品简介 价格说明 购买指南 用户指南 API参考 最佳实践 常见问题 视频帮助等技术文档 帮助您快速上手使用华为云服务 您可以通过华为云的域名注册服务管理您的域名 如表1所示 服
  • 无法连接imessages信息服务器,如何屏蔽imessage广告 iPhone怎么屏蔽iMessages广告【详解】...

    很多苹果设备用户都会用到iMessages 苹果设备之间聊天很方便 不过iMessages广告却是一个神烦的存在 怎么屏蔽iMessages广告 下面IT百科小编和大家分享几种屏蔽iMessages广告的方法 大家可以根据自己的使用习惯选择
  • QWidget的背景颜色和背景图片的设置

    首先设置autoFillBackground属性为真 然后定义一个QPalette对象 设置QPalette对象的背景属性 颜色或图片 最后设置QWidget对象的Palette 实例 QWidget widget new QWidget
  • web基础学习笔记(九)之节点常用属性和方法

    节点常用属性和方法 getElementsByTagName 获取当前节点的指定标签名孩子节点 gappendChild oChildNode 添加一个子节点 oChildNode是要添加的孩子节点 属性 childNodes 获取当前节点
  • Docker---本地镜像发布到阿里云

    本地镜像发布到阿里云 1 准备前提 2 以当前运行运行的mycentos运行实例 以它为模板commit一个新的mycentos镜像 3 将本地镜像推送到阿里云 3 1 本地镜像素材原型 3 2 登录阿里云开发者平台创建镜像仓库 3 2 1
  • jQuery基本筛选器

    3 jQuery基本筛选器 3 1 first 获取第一个元素 用法 ul li list item 1 li li list item 2 li li list item 3 li li list item 4 li li list it
  • https网络编程——SSL的加密和解密过程

    参考 SSL的加密和解密过程 地址 https qingmu blog csdn net article details 108214105 spm 1001 2014 3001 5502 目录 现在的加密 解密技术主要有三种 对称加密 非
  • 设置EntityFramework中decimal类型数据精度问题(EF默认将只会保留到2为精度)

    原文 设置EntityFramework中decimal类型数据精度 EF中默认的decimal数据精度为两位数 当我们数据库设置的精度大于2时 EF将只会保留到2为精度 e g 2 19990将会被保存为2 20 1 解决方案一是网上找到
  • js作用域、闭包和浏览器渲染原理

    一 js作用域 变量的作用域是指变量在整个程序中作用 可访问 的范围 1 作用域的类型 三个类型 全局作用域 局部作用域 函数作用域 块级作用域 ES6新增 1 全局作用域 如果一个变量为全局作用域 那么这个变量在程序的任意位置都可以访问
  • 主流显卡Linux系统驱动安装--intel、ATi篇

    Intel 集成显卡的Linux驱动安装 目前使用Intel 集成显卡的计算机主要集中在中低端商务台式机和中低端笔记本电脑 这里介绍一下Linux下显卡驱动安装方法 I ntel针对集成显示芯片提供了两种驱动程序 i915Graphics和
  • BigInteger和BigDecimal的使用

    1 BigInteger类的常用方法 java math BigInteger类表示一个超大的整数 而且支持任意精度整数的四则运算 加减乘除 常用方法 方法 含义 public BigInteger String val 将 BigInte