Java BigDecimal学习

news/2024/5/3 22:49:00/文章来源:https://blog.csdn.net/a1275302036/article/details/128354282

文章目录

    • Java BigDecimal不损失精度的方法
    • Java BigDecimal的几种舍入模式
      • 1、UP(BigDecimal.ROUND_UP)
      • 2、DOWN(BigDecimal.ROUND_DOWN)
      • 3、CEILING(BigDecimal.ROUND_CEILING)
      • 4、FLOOR(BigDecimal.ROUND_FLOOR)
      • 5、HALF_UP(BigDecimal.ROUND_HALF_UP)
      • 6、HALF_DOWN(BigDecimal.ROUND_HALF_DOWN)
      • 7、HALF_EVEN(BigDecimal.ROUND_HALF_EVEN)
      • 8、UNNECESSARY(BigDecimal.ROUND_UNNECESSARY)
    • Java BigDecimal不同模式下的舍入操作举例汇总
    • Java BigDecimal进行除法运算报异常
      • 问题现象
      • 原因分析
      • 解决方法

Java BigDecimal不损失精度的方法

1、调用valueOf()方法(推荐)
2、调用构造方法BigDecimal(String)

在这里插入图片描述

Java BigDecimal的几种舍入模式

1、UP(BigDecimal.ROUND_UP)

  • 向绝对值最大的方向舍入
  • 只要舍弃位非0即进位

2、DOWN(BigDecimal.ROUND_DOWN)

  • 向绝对值最小的方向输入
  • 所有的位都舍弃,不存在进位情况。

3、CEILING(BigDecimal.ROUND_CEILING)

  • 天花板数:正数变大,负数也是变大。即正得越多,负得越少。
  • 正数,只要舍弃位非0即进位,同UP。负数,所有的位都舍弃,不存在进位情况,同DOWN。
  • Math.round方法使用的即为此模式。

4、FLOOR(BigDecimal.ROUND_FLOOR)

  • 地板数:正数变小,负数也是变小。即正得越少,负得越多。
  • 正数,所有的位都舍弃,不存在进位情况,同DOWN。负数,只要舍弃位非0即进位,同UP。

5、HALF_UP(BigDecimal.ROUND_HALF_UP)

最近数字舍入(5舍)。经典的四舍五入,5是进位。

6、HALF_DOWN(BigDecimal.ROUND_HALF_DOWN)

最近数字舍入(5舍)。HALF_DOWN中5是舍弃不进位。

示例代码:

// 5.5 
// 舍弃位为5,舍弃位后的数字为0
BigDecimal sum = BigDecimal.valueOf(5.550).setScale(1,BigDecimal.ROUND_HALF_DOWN);
// 5.6 
// 舍弃位为5,舍弃位后的数字非0
BigDecimal sum = BigDecimal.valueOf(5.551).setScale(1,BigDecimal.ROUND_HALF_DOWN);
// 5.6
// 舍弃位为5,舍弃位后的数字非0
BigDecimal sum = BigDecimal.valueOf(5.55001).setScale(1,BigDecimal.ROUND_HALF_DOWN);
// -5.6
// 舍弃位为5,舍弃位后的数字非0
BigDecimal sum = BigDecimal.valueOf(-5.55001).setScale(1,BigDecimal.ROUND_HALF_DOWN);

7、HALF_EVEN(BigDecimal.ROUND_HALF_EVEN)

银行家算法。
四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一。

8、UNNECESSARY(BigDecimal.ROUND_UNNECESSARY)

断言请求的操作具有精确的结果,因此不需要舍入。
如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。

示例代码:

// 抛出ArithmeticException 只有1位小数时不会报错
BigDecimal sum = BigDecimal.valueOf(-5.81).setScale(1,BigDecimal.ROUND_UNNECESSARY);

参考链接

Java BigDecimal不同模式下的舍入操作举例汇总

输入给定数字,保留1位数的结果如下:

输入数字UPDOWNCEILINGFLOORHALF_UPHALF_DOWN
1.341.41.31.41.31.31.3
1.351.41.31.41.31.41.3
1.361.41.31.41.31.41.4
-1.34-1.4-1.3-1.3-1.4-1.3-1.3
-1.35-1.4-1.3-1.3-1.4-1.4-1.3
-1.351-1.4-1.3-1.3-1.4-1.4-1.4
-1.36-1.4-1.3-1.3-1.4-1.4-1.4

Java BigDecimal进行除法运算报异常

问题现象

执行下面的代码:

BigDecimal sum = new BigDecimal("777.77");
BigDecimal avg = sum.divide(new BigDecimal("15"));
System.out.println(avg);

报错:

Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.at java.math.BigDecimal.divide(BigDecimal.java:1693)at com.chuenhung.Test.main(Test.java:9)

原因分析

BigDecimal进行除法运算时,准确的商可能是一个无限长的小数,如果此时没有指定舍入模式,就会报ArithmeticException。
上面的777.77除以15的结果是个无限循环小数,而没有指定舍入模式,所以报错。

解决方法

调divide(divisor, scale, roundingMode);方法,其中scale为保留位数,roundingMode为舍入模式。

// 示例
BigDecimal avg = sum.divide(new BigDecimal("15"),3,BigDecimal.ROUND_DOWN);

参考链接

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QMake宏定义常量和字符串或带空格的字符串(在代码中使用)

答案 宏定义常量 DEFINES EXPIR_TIME123宏定义字符串(不带空格) DEFINES NIHAO\\\"nihao\\\"宏定义字符串(带空格也适用于不带空格的情况) 推荐 DEFINES NIHAO\"\\\"ni" "hao\\\"\"QMAKE宏定义常量 环境: visual studio 2018 …

Java基础之List

文章目录一、List介绍二、List常用方法 List应知应会2.1 调用add()方法增添数据(可指定位置添加)2.2 调用remove()方法删除指定位置元素并返回被删除元素2.3 调用set()方法修改指定位置元素并返回初始数据2.4 调用get()方法返回指定位置元素三、List可重…

SQL注入写入文件方法(获取webshell)

数据库写入文件条件 1、当前数据库用户为 root 权限2、知道当前网站的绝对路径3、secure_file_priv 的参数必须为空或目录地址4、PHP的 GPC 为 off状态;(魔术引号,GET,POST,Cookie)用 sqli-labs 测试查看当前用户权限Python sqlma…

本机连接Vmware虚拟机中win7的SQLServer数据库

在开发中,可能遇到不同数据库或不同版本的问题,为了避免在本机安装卸载造成后续无法再次安装的情况,我们在虚拟机中安装需要的版本进行测试。 本篇介绍如何在本机连接到虚拟机中的数据库。 解决流程如下: 一:进入虚…

学Vue3这一篇就够了!

目录学习Vue的前提是掌握 HTML,CSS,Js中级知识vue介绍声明式渲染条件与循环处理用户输入组件化应用构建Vue与自定义元素的关系应用和组件实例Vue实例根组件组件实例 property生命周期钩子实例的生命周期图模板语法插值文本原始 HTMLAttribute使用 JavaScript 表达式指令参数动态…

Linux驱动开发——字符设备

目录 Linux设备分类 字符设备驱动基础 字符设备驱动框架 虚拟串口设备 Linux设备分类 Linux系统根据驱动程序实现的模型框架将设备驱动分为下面三种。 (1)字符设备驱动:设备对数据的处理是按照字节流的形式进行的,可以支持随机访问,也可以不支持随…

抽象类,接口

抽象类:当父类的某些方法,需要声明,但是又不确定如何实现时,可以将其声明为抽象方法,那么这个类就是抽象类。 package com.hspedu.abstract_;public class Abstract01 {public static void main(String[] args) {} } a…

Linux 操作系统原理 — PCIe 总线标准

目录 文章目录目录总线系统PCIe 总线PCIe 总线的传输速率PCIe 总线的架构PCIe 外设PCIe 设备的枚举过程PCIe 设备的编址方式BDF(Bus-Device-Function)编号BAR(Base Address Register)地址Linux 上的 PCIe 设备查看 PCIe 设备的 BD…

算法强化--两数之和

hi,大家好,今天为大家带来一道题目,求两数之和 题目 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一…

Python 进阶指南(编程轻松进阶):三、使用 Black 工具来格式化代码

原文:http://inventwithpython.com/beyond/chapter3.html 代码格式化是将一组规则应用于源代码,从而使得代码风格能够简洁统一。虽然代码格式对解析程序的计算机来说不重要,但代码格式对于可读性是至关重要的,这是维护代码所必需的…

【剑指offer|4.从尾到头打印单链表】

0.从尾到头打印单链表 单链表:一般给的都是无头节点的 另外:在面试中,如果我们打算修改输入的数据,则最好问一下面试官是不是允许修改 下面这种先把链表节点的值按链表序放到数组中,然后来一个算法库中的reverse属实有…

一文懂KL散度KL Divergence

本文翻译自https://naokishibuya.medium.com/demystifying-kl-divergence-7ebe4317ee68 KL散度中的KL全称是Kullback-Leibler,分别表示Solomon Kullback和Richard A.Leibler这两个人。 一、KL散度的定义 KL散度表明概率分布Q和概率分布P之间的相似性,由…

ARM Linux 内核启动1 —— 汇编阶段

一、Makefile分析 1、Makefile 分析 (1) kernel 的 Makefile 写法和规则等,和 uboot 的 Makefile 是一样的,甚至 Makefile 中的很多内容都是一样的。 (2) kernel 的 Makefile 比 uboot 的 Makefile 要复杂,这里我们并不会一行一行的详细分析…

【20】核心易中期刊推荐——计算机科学电子通信(EI索引)

🚀🚀🚀NEW!!!核心易中期刊推荐栏目来啦 ~ 📚🍀 核心期刊在国内的应用范围非常广,核心期刊发表论文是国内很多作者晋升的硬性要求,并且在国内属于顶尖论文发表,具有很高的学术价值。在中文核心目录体系中,权威代表有CSSCI、CSCD和北大核心。其中,中文期刊的数…

进阶C语言:文件操作

文件操作不仅仅是我们使用鼠标用来操作文件的各项功能,还可以使用C语言来操作文件的内容,可以使用C语言来对文件的读、写、拷贝...等等,话不多说,直接开始: 目录 1.为什么要使用文件 2.什么是文件 2.1程序文件 2.…

蓝桥杯【第14届省赛】Python B组

本题解不一定正确,欢迎大家指正 A:2023 【问题描述】 请求出在 12345678 至 98765432 中,有多少个数中完全不包含 2023 。 完全不包含 2023 是指无论将这个数的哪些数位移除都不能得到 2023 。 例如 20322175,33220022 都完全不包…

python实现获取当前目录下的树形结构

python实现获取当前目录下的树形结构 程序实现 在有些Linux上自带了tree命令来一树状结构显示一个目录,但是在有些linux上没有自带这个程序,所以这里用python写了一个小程序来实现这个功能,代码如下: import osdef print_tree(…

共模电感(扼流圈) 差模电感(扼流圈)

共模电感 共模电感,也叫共模扼流圈。常用于电脑的开关电源,过滤共模的电磁干扰信号。 共模电感器由软磁铁芯(铁氧体磁芯)和两组同相绕制的线圈组成。对于共模信号,由于两组线圈产生的磁场不是抵消。而是相互叠加&…

存量市场之下,电商之战深入腹地且逻辑未变

纵然是在流量依然见顶的大背景下,电商行业的竞争并未结束。无论是以百亿补贴为代表的烧钱策略,还是以跨境出海为代表的规模策略,几乎都是这样一种现象的直接体现。种种迹象表明,未来的电商行业,依然会有新的战役发生。…

Hadoop集群环境搭建与应用回顾

文章目录一、 实训项目名称二、 学习情况小结三、 项目中用到的知识点四、 实训项目中负责功能板块五、 实训项目实现六、 实训项目过程中遇到的问题及解决方法七、实训体会与心得一、 实训项目名称 Hadoop集群环境搭建与应用 二、 学习情况小结 实操一部分: 通…