BigDecimal进行除法运算时的坑

循环小数输出的坑

BigDecimal做除法时如果出现除不尽(循环小数)的情况,会抛异常:

BigDecimal a = new BigDecimal("1");
System.out.println(a.divide(new BigDecimal(3)));

异常如下:

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

解决办法:使用如下两个函数设置精度

  • divide(num, scale)
  • divide(num, scale, roundingMode)
System.out.println(a.divide(new BigDecimal(30), 2,BigDecimal.ROUND_HALF_UP)); 

构造函数的坑

先看下面这段代码:

public static void main(String[] args) {
    BigDecimal value1 =new BigDecimal(1024.511);
    System.out.println("value1: " + value1);
    BigDecimal value2 = new BigDecimal("1024.511");
    System.out.println("value2: " + value2);
}

按照我们的预想,value1输出的应该是10.511,可是实际的值却不是这样,如下:

value1: 10.510999999999999232613845379091799259185791015625
value2: 10.511 

当我们用double类型的数据作为参数时,构造出的 BigDecimal 对象 value1 并不能保证数据的准确性。而用 String 作为参数构造对象时,数据丝毫不差。

Reference

https://blog.csdn.net/song19890528/article/details/76771943/

原文地址:https://www.cnblogs.com/east7/p/11706738.html

时间: 2024-08-26 06:45:25

BigDecimal进行除法运算时的坑的相关文章

BigDecimal除法运算出现java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result的解决办法

今天在使用两个BigDecimal类型的数字做除法运算时,出现了一个如下的异常信息: 1 java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result 上网查了一下这个异常的,找到了原因所在:通过BigDecimal的divide方法进行除法时当不整除,出现无限循环小数时,就会抛异常:java.lang.ArithmeticException: Non

bigdecimal类型除法问题

坑:bigdecimal类型做除法运算时,结果为整数或有限小数时候不存在问题,若结果无法整除,为无限小数时报错 错误代码:Bigdecimal  b = a.divide(c).setScale(5,ROUND_HALF_DOWN); 错误提示:Non-terminating decimal expansion; no exact representable decimal result" 错误翻译:十进制小数点膨胀:没有确切的表示十进制的结果 错误原因:暂时不详 代码改进:BigDecimal

解决java.math.BigDecimal divide方法运算结果为无限小数问题

http://samueli.iteye.com/blog/224755 BigDecimal除法运算报错,错误如下:Non-terminating decimal expansion; no exact representable decimal result 原因是: BigDecimal divide(BigDecimal divisor, int scale, int roundingMode) if divisor is zero, roundingMode==ROUND_UNNECE

BigDecimal进行除法divide运算注意事项

Java编程中 BigDecimal进行除法divide运算时,如果结果不整除,出现无限循环小数.则会抛出以下异常: java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. 应用场景:一批中供客户的单价是1000元/年,如果按月计算的话1000/12=83.3333333333.... 解决之道:就是给divide设置精确的小数点divide(

sql 除法运算结果为小数时显示0的解决方案 或者百分比

SELECT field1/field2 FROM TB; 当 field1的数值 > field2的数值时,除法得出的结果是<1的,即0.xxxxxx 这个时候在DB2的环境下SELECT出来的值是0 解決方法: 先把field1转换成DOUBLE类型的,这样计算出来的就会得出小数点了,会显示出0.xxxx SELECT CAST(field1 AS FLOAT)/field2 FROM TB; ps.網上搜的資料,寫的是double,但在SQL Server2008中一直報錯,改成FLOA

Double 类型运算时的精度问题

double 类型运算时的 计算的精度不高,经常会出现0.999999999999999这样的情况,那么就需要用BigDecimal   它是java提供的用来高精度计算的工具类 下面是对这个类的一个包装,方便使用: package cn.soft.util; import java.io.Serializable; import java.math.BigDecimal; import org.springframework.stereotype.Component; /** *类描述: do

关于Java中用Double型运算时精度丢失的问题

注:转自 https://blog.csdn.net/bleach_kids/article/details/49129943 在使用Java,double 进行运算时,经常出现精度丢失的问题,总是在一个正确的结果左右偏0.0000**1. 特别在实际项目中,通过一个公式校验该值是否大于0,如果大于0我们会做一件事情,小于0我们又处理其他事情. 这样的情况通过double计算出来的结果去和0比较大小,尤其是有小数点的时候,经常会因为精度丢失而导致程序处理流程出错. BigDecimal在<Eff

使用BigDecimal进行精确运算

使用BigDecimal进行精确运算 首先我们先来看如下代码示例: 1 public class Test_1 { 2 public static void main(String[] args) { 3 System.out.println(0.06+0.01); 4 System.out.println(1.0-0.42); 5 System.out.println(4.015*100); 6 System.out.println(303.1/1000); 7 } 8 9 } 运行结果如下.

深入理解计算机系统(2.6)---二进制整数的乘、除法运算(重要)【困难度高】

本文转载地址:http://www.cnblogs.com/zuoxiaolong/p/computer10.html 2.5我们着重介绍了二进制整数的加.减运算,本次我们继续介绍乘.除运算. 引言 运算一直是程序运行当中一个重要的环节,而在二进制的运算过程当中,加法运算又是重中之重,它基本上奠定了二进制运算的基础.因为无论是减法还是乘法,都可以由加法运算来替代,唯有除法不能由加法替代. 了解计算机运算的规律,可以有助于我们理解很多程序代码上无法理解的内容.比如上章提到的溢出问题,在了解了加法运