【异常解决】Non-terminating decimal expansion; no exact representable decimal result.

news2024/11/18 14:42:13

Non-terminating decimal expansion; no exact representable decimal result.

  • 一、背景描述
  • 二、异常原因
  • 三、解决方案
  • 四、RoundingMode(舍入模式)
    • 4.1、ROUND_UP
    • 4.2、ROUND_DOWN
    • 4.3、ROUND_CEILING
    • 4.4、ROUND_FLOOR
    • 4.5、ROUND_HALF_UP(四舍五入)
    • 4.6、ROUND_HALF_DOWN
    • 4.7、ROUND_HALF_EVEN
    • 4.8、ROUND_UNNECESSARY

一、背景描述

今天在计算新老消息百分比时(新收到的消息/总消息)的时候遇到了一个错误,java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.

英文翻译:非终止十进制扩展; 没有确切的可表示的十进制结果。翻译成大白话就是:通过BigDecimaldivide方法进行除法时当两个数不整除,出现无限循环小数时,java不知道怎么弄了,它就会抛出上述异常。

以下是错误的写法示例:

public class Test4 {

    public static void main(String[] args) {
        BigDecimal divide = BigDecimal.valueOf(10).divide(BigDecimal.valueOf(3));
        System.out.println(divide);
    }
}

在这里插入图片描述

二、异常原因

原因是 Java 中使用 BigDecimal 做除法运算的时候,值有可能是无限循环的小数,所以我们就需要在 divide 方法中传递第二个参数,来定义小数点后的精确位数,否则在不整除的情况下,结果是无限循环的小数,就会抛出上面这个异常。

三、解决方案

在 divide 方法中传递第二个参数,来定义小数点后的精确位数。

正确的写法如下:

public class Test4 {

    public static void main(String[] args) {
        BigDecimal divide = BigDecimal.valueOf(10).divide(BigDecimal.valueOf(3), 2, RoundingMode.HALF_UP);
        System.out.println(divide);
    }
}

四、RoundingMode(舍入模式)

RoundingMode 是一个 Java 提供的舍入模式枚举类,包含我们日常使用的四舍五入,直接进一等模式:

4.1、ROUND_UP

直接舍去非零的小数位数,对整数位 +1。比如上面的用例,使用此模式会返回结果:4

4.2、ROUND_DOWN

直接舍去小数位数,不对整数位 +1。比如上面的用例,会返回结果:3

4.3、ROUND_CEILING

如果结果为正数,则舍入行为与 ROUND_UP 相同;如果为负,则舍入行为与 ROUND_DOWN 相同。返回结果:3

4.4、ROUND_FLOOR

如果结果为正数,则舍入行为与 ROUND_DOWN 相同;如果为负,则舍入行为与 ROUND_UP 相同。返回结果:3

4.5、ROUND_HALF_UP(四舍五入)

如果舍弃部分 >= 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同。返回结果:3

4.6、ROUND_HALF_DOWN

如果舍弃部分 > 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同(五舍六入)。返回结果:3

4.7、ROUND_HALF_EVEN

向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。

如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同;

如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。

Tips:在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。
此舍入模式也称为“银行家舍入法”,主要在美国使用。四舍六入,五分两种情况。
如果前一位为奇数,则入位,否则舍去。

示例:以下例子为保留小数点1位,那么这种舍入方式下的结果。

1.15>1.2 
1.25>1.2

4.8、ROUND_UNNECESSARY

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

在精确度要求较高,且金额计算比较复杂的情况下,建议尽量使用 ROUND_HALF_EVEN 模式。

本文完结!

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

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

相关文章

SQL语句的编写

##创建用户-建表建库 #创建一个用户名为 feng,允许从任何主机 % 连接,并使用密码 sc123456 进行身份验证的用户。 rootTENNIS 16:33 scmysql>create user feng% identified by sc123456; Query OK, 0 rows affected (0.04 sec) #创建一个名为fen…

软考113-上午题-【计算机网络】-IPv6、无线网络、Windows命令

一、IPv6 IPv6 具有长达 128 位的地址空间,可以彻底解决 IPv4 地址不足的问题。由于 IPv4 地址是32 位二进制,所能表示的IP 地址个数为 2^32 4 294 967 29640 亿,因而在因特网上约有 40亿个P 地址。 由 32 位的IPv4 升级至 128 位的IPv6&am…

ChromeOS 中自启动 Fcitx5 和托盘 stalonetray

ChromeOS 更新的飞快,旧文章的方法也老是不好用,找遍了也没找到很好的可以开机自启动 Linux VM 和输入法、托盘的方法。 研究了一下(不,是很久),终于找到个丑陋的实现。 方法基于 ChromeOS 123.0.6312.94…

域名应该如何实名?域名应该如何备案?域名如何解析到服务器

大家好欢迎来到易极赞,今天我们来跟大家聊一下“域名应该如何实名以及备案”这个话题。 域名实名认证是验证域名所有者身份的过程,以确保域名的合法性,通常需要登录到域名服务商后台,进行域名的注册,注册后创建域名模…

MYSQL 锁机制 与 MVCC多版本并发

MYSQL锁机制与优化以及MVCC底层原理 锁分类 乐观锁,悲观锁 从性能上分为乐观锁(版本对比,版本一致就更新,不一致就不更新或CAS机制)和悲观锁(锁住资源等待),乐观锁适合读比较多的场景&#x…

Unity和Android的交互

Unity和Android的交互 一、前言二、Android导出jar/aar包到Unity2.1 版本说明2.2 拷贝Unity的classes.jar给Android工程2.2.1 classes.jar的位置2.2.2 Android Studio创建module2.2.3 拷贝classes.jar 到 Android工程并启用 2.3 编写Android工程代码2.3.1 创建 MainActivity2.…

springboot之mybatisPlus多表查询及分页查询

文章目录 一、多表查询二、mybatis-plus条件查询三、分页查询 一、多表查询 可能会用到的注解 这里的场景是,查询每个用户及其所有的订单。就是查询你的id号的同时,把你所有的历史订单信息都拉出来。 表结构这样 CREATE TABLE User ( id INT PRIMARY…

Pytorch数据结构:GPU加速

文章目录 一、GPU加速1. 检查GPU可用性:2. GPU不可用需要具体查看问题3. 指定设备4.将张量和模型转移到GPU5.执行计算:6.将结果转移回CPU 二、转移原理1. 数据和模型的存储2. 数据传输3. 计算执行4. 设备管理5.小结 三、to方法的参数类型 一、GPU加速 .…

Jetson nano部署Yolov8 安装Archiconda3+创建pytorch环境(详细教程+错误解决)

由于jetson nano 是aarch64架构,Anaconda官方不支持aarch64架构,所以有了一个叫“Archiconda”,其目的就是将conda移植到aarch64平台上 一. 下载地址Releases Archiconda/build-tools GitHub 然后安装archiconda bash Archiconda3-0.2.3…

stm32 HAL中断GPIO——1

1选择引脚为中断 中断详细配置 1 模式选择 上拉下拉 再点击NVIC可进行分组 再勾选如图 总结步骤 1选择中断 2配置时钟//选择外部时钟 3配置模式 4勾选NVIC

绝地求生:2024工资杯S2D2:单日前五队伍瓜分吃鸡,CCG暂居积分总榜首!

2024工资杯S2第二天小组赛结束,今日场上吃鸡和分数被CCG、17、AVG、PeRo、CTG这五支队伍瓜分,在XDD回归后,PeRo更是打出了单场20杀吃鸡大分局。 目前CCG以122分暂居小组积分榜首,AVG、MNG紧随其后,明日BC组&#xff0c…

【Linux】shell 脚本基础使用

在终端中输入命令可以完成一些常用的操作,但是我们都是一条一条输入命令,比较麻烦,为了解决这个问题,就会涉及到 shell 脚本,它可以将很多条命令放到一个文件里面,然后直接运行这个文件即可。 shell 脚本类…

STM32使用HAL库获取GPS模块HT1818Z3G5L信息(方法1)

1、写在最前 先了解一下GPRMC的格式 格 式: GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,A*50 说 明: 字段 0:$GPRMC,语句ID,表明该语句为Recommended Minimum Specific GPS/TRANSIT Data&…

【服务器部署篇】Linux下安装Docker容器

作者介绍:本人笔名姑苏老陈,从事JAVA开发工作十多年了,带过大学刚毕业的实习生,也带过技术团队。最近有个朋友的表弟,马上要大学毕业了,想从事JAVA开发工作,但不知道从何处入手。于是&#xff0…

计算机网络——37认证

认证 目标:Bob需要Alice证明他的身份 Protocol ap1.0:Alice说"A am Alice" 可能出现的问题: 在网络上Bob看不到Alice,因此Trudy可以简单的声称他是Alice 认证:重新尝试 Protocol ap2.0:Alice…

继电器线圈两端为什么要反向并联二极管

原理描述: 电感的特点:穿过电感的电流不会突然变化,也就是说变化的电流在电感上面会产生感应电动势。 感应电动势的作用:阻碍电流的变化。 三极管断开之前,电流是穿过线圈,原来的电流是从上往下流动&#…

自定义实现shell/bash

文章目录 函数和进程之间的相似性shell打印提示符,以及获取用户输入分割用户的输入判断是否是内建命令执行相关的命令 全部代码 正文开始前给大家推荐个网站,前些天发现了一个巨牛的 人工智能学习网站, 通俗易懂,风趣幽默&#…

数据结构和算法:分治

分治算法 分治(divide and conquer),全称分而治之,是一种非常重要且常见的算法策略。分治通常基于递归实现,包括“分”和“治”两个步骤。 1.分(划分阶段):递归地将原问题分解为两个…

C语言自定义类型变量——枚举(enum)

一.枚举的定义和声明 字面意思,枚举就是一一列举,把可能的取值一一列举,在我们现实生活中有许多可以列举的事物,例如:一周七天,一年四季,性别,月份,三原色等等。当我们需…

vim美化配置(懒人版)

文章目录 配置vim(懒人版)1.搜索资源2.安装3.自定义缩进4.卸载方法 配置vim(懒人版) 1.搜索资源 打开gitee,注意到上面的搜索框 搜索 vimforcpp 进入,找到安装方法中的链接 2.安装 复制粘贴到linux中的命…