Java中BigDecimal的使用

2024-06-14 14:58
文章标签 java 使用 bigdecimal

本文主要是介绍Java中BigDecimal的使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在日常开发中我们经常会碰到小数计算,而小数直接计算的话会出现一些小小的错误,如下


System.out.println(1.01 + 2.02);

你说能输出什么?3.03?实际上输出的是3.0300000000000002。这是因为不论是float 还是double都是浮点数,而计算机是二进制的,浮点数会失去一定的精确度。有没有不失精度的办法呢?这里就要用到BigDecimal了。

java.math.BigDecimal。Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。

创建BigDecimal对象主要有两种。

  1. BigDecimal b1 = new BigDecimal( "1.34"); //1.34
  2. BigDecimal b2 = BigDecimal.valueOf( 1.34); //1.34

其中b1也可以写成new BigDecimal(Double.toString(1.34)),可以直接new BigDecimal(1.34)吗,也是可以的,只是会出现上述的精度问题。

  1. BigDecimal one1 = new BigDecimal( 1.34); //1.3400000000000000799360577730112709105014801025390625
  2. BigDecimal two1 = new BigDecimal( "1.34"); //1.34

除了这两种外,特殊的像0、1、10可以这样写。

  1. BigDecimal zero = BigDecimal.ZERO;
  2. BigDecimal one = BigDecimal.ONE;
  3. BigDecimal ten = BigDecimal.TEN;


比较一下BigDecimal.ZERO、new BigDecimal("0")、BigDecimal.valueOf(0)这三者,equals都是true,==的话 new BigDecimal("0")就不用看了都new了,而BigDecimal.ZERO == BigDecimal.ZERO为true。查看一下源代码可得。


  1. public static BigDecimal valueOf(long val) {
  2. if (val >= 0 && val < zeroThroughTen.length)
  3. return zeroThroughTen[( int)val];
  4. else if (val != INFLATED)
  5. return new BigDecimal( null, val, 0, 0);
  6. return new BigDecimal(INFLATED_BIGINT, val, 0, 0);
  7. }

  1. // Cache of common small BigDecimal values.
  2. private static final BigDecimal zeroThroughTen[] = {
  3. new BigDecimal(BigInteger.ZERO, 0, 0, 1),
  4. new BigDecimal(BigInteger.ONE, 1, 0, 1),
  5. new BigDecimal(BigInteger.valueOf( 2), 2, 0, 1),
  6. new BigDecimal(BigInteger.valueOf( 3), 3, 0, 1),
  7. new BigDecimal(BigInteger.valueOf( 4), 4, 0, 1),
  8. new BigDecimal(BigInteger.valueOf( 5), 5, 0, 1),
  9. new BigDecimal(BigInteger.valueOf( 6), 6, 0, 1),
  10. new BigDecimal(BigInteger.valueOf( 7), 7, 0, 1),
  11. new BigDecimal(BigInteger.valueOf( 8), 8, 0, 1),
  12. new BigDecimal(BigInteger.valueOf( 9), 9, 0, 1),
  13. new BigDecimal(BigInteger.TEN, 10, 0, 2),
  14. };

发现10以内的对象都是同一个,所以为true。


BigDecimal的加减乘除运算。

  1. public BigDecimal add(BigDecimal value); //加法
  2. public BigDecimal subtract(BigDecimal value); //减法
  3. public BigDecimal multiply(BigDecimal value); //乘法
  4. public BigDecimal divide(BigDecimal value); //除法
也可以照下面加法例子写成一个util,另外三个都差不多就不展开了。

  1. public static double add(double value1,double value2){
  2. BigDecimal b1 = new BigDecimal(Double.toString(value1));
  3. BigDecimal b2 = new BigDecimal(Double.toString(value2));
  4. return b1.add(b2).doubleValue();
  5. }
BigDecimal的运算都没有对原值进行操作,而是返回一个新的BigDecimal对象,这点可能有些小伙伴会搞错要注意一下。
  1. BigDecimal b1 = new BigDecimal( "1.34");
  2. System.out.println( "b1: " + b1);
  3. BigDecimal b2 = new BigDecimal( "2.34");
  4. b1.add(b2);
  5. System.out.println( "b1: " + b1); //b1并没有变
BigDecimal的比较用的是BigDecimal的compareTo方法,将此 BigDecimal 与指定的 BigDecimal 比较。

根据此方法,值相等但具有不同标度的两个BigDecimal对象(如,2.0 和 2.00)被认为是相等的。

当此 BigDecimal 在数字上小于、等于或大于被比较对象时,返回 -1、0 或 1。

  1. BigDecimal one = BigDecimal.valueOf( 1);
  2. BigDecimal two = BigDecimal.valueOf( 2);
  3. BigDecimal three = one.add(two);
  4. int i1 = one.compareTo(two); //-1
  5. int i2 = two.compareTo(two); //0
  6. int i3 = three.compareTo(two); //1



这篇关于Java中BigDecimal的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1060727

相关文章

Java计算经纬度距离的示例代码

《Java计算经纬度距离的示例代码》在Java中计算两个经纬度之间的距离,可以使用多种方法(代码示例均返回米为单位),文中整理了常用的5种方法,感兴趣的小伙伴可以了解一下... 目录1. Haversine公式(中等精度,推荐通用场景)2. 球面余弦定理(简单但精度较低)3. Vincenty公式(高精度,

使用Java将实体类转换为JSON并输出到控制台的完整过程

《使用Java将实体类转换为JSON并输出到控制台的完整过程》在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用JSON格式,用Java将实体类转换为J... 在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用j

Java实现视频格式转换的完整指南

《Java实现视频格式转换的完整指南》在Java中实现视频格式的转换,通常需要借助第三方工具或库,因为视频的编解码操作复杂且性能需求较高,以下是实现视频格式转换的常用方法和步骤,需要的朋友可以参考下... 目录核心思路方法一:通过调用 FFmpeg 命令步骤示例代码说明优点方法二:使用 Jaffree(FF

Java实现图片淡入淡出效果

《Java实现图片淡入淡出效果》在现代图形用户界面和游戏开发中,**图片淡入淡出(FadeIn/Out)**是一种常见且实用的视觉过渡效果,它可以用于启动画面、场景切换、轮播图、提示框弹出等场景,通过... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细

Java如何用乘号来重复字符串的功能

《Java如何用乘号来重复字符串的功能》:本文主要介绍Java使用乘号来重复字符串的功能,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java乘号来重复字符串的功能1、利用循环2、使用StringBuilder3、采用 Java 11 引入的String.rep

Nginx使用Keepalived部署web集群(高可用高性能负载均衡)实战案例

《Nginx使用Keepalived部署web集群(高可用高性能负载均衡)实战案例》本文介绍Nginx+Keepalived实现Web集群高可用负载均衡的部署与测试,涵盖架构设计、环境配置、健康检查、... 目录前言一、架构设计二、环境准备三、案例部署配置 前端 Keepalived配置 前端 Nginx

Python logging模块使用示例详解

《Pythonlogging模块使用示例详解》Python的logging模块是一个灵活且强大的日志记录工具,广泛应用于应用程序的调试、运行监控和问题排查,下面给大家介绍Pythonlogging模... 目录一、为什么使用 logging 模块?二、核心组件三、日志级别四、基本使用步骤五、快速配置(bas

SpringBoot中HTTP连接池的配置与优化

《SpringBoot中HTTP连接池的配置与优化》这篇文章主要为大家详细介绍了SpringBoot中HTTP连接池的配置与优化的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、HTTP连接池的核心价值二、Spring Boot集成方案方案1:Apache HttpCl

使用animation.css库快速实现CSS3旋转动画效果

《使用animation.css库快速实现CSS3旋转动画效果》随着Web技术的不断发展,动画效果已经成为了网页设计中不可或缺的一部分,本文将深入探讨animation.css的工作原理,如何使用以及... 目录1. css3动画技术简介2. animation.css库介绍2.1 animation.cs

Spring Boot项目打包和运行的操作方法

《SpringBoot项目打包和运行的操作方法》SpringBoot应用内嵌了Web服务器,所以基于SpringBoot开发的web应用也可以独立运行,无须部署到其他Web服务器中,下面以打包dem... 目录一、打包为JAR包并运行1.打包为可执行的 JAR 包2.运行 JAR 包二、打包为WAR包并运行