Java中BigDecimal类介绍及用法

Java中BigDecimal类介绍及用法

Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高精度计算.
  其中 BigInteger 类是针对大整数的处理类,而 BigDecimal 类则是针对大小数的处理类.
  BigDecimal 类的实现用到了 BigInteger类,不同的是 BigDecimal 加入了小数的概念.
  float和Double只能用来做科学计算或者是工程计算;在商业计算中,对数字精度要求较高,必须使用 BigInteger 类和 BigDecimal 类,它支持任何精度的定点数,可以用它来精确计算货币值.
  BigDecimal类创建的是对象,不能使用传统的+、-、*、/等算术运算符直接对其进行数学运算,而必须调用其对应的方法.方法的参数也必须是BigDecimal类型的对象.

一、构造BigDecimal 对象常用方法

1、方法一

BigDecimal BigDecimal(double d); //不允许使用

2、方法二

BigDecimal BigDecimal(String s); //常用,推荐使用

3、方法三

static BigDecimal valueOf(double d); //常用,推荐使用

注意:

1. double 参数的构造方法,不允许使用!!!因为它不能精确的得到相应的值,值会变大;
  2. String 构造方法是完全可预知的: 写入 new BigDecimal(“0.1”) 将创建一个 BigDecimal,它正好等于预期的0.1; 因此,通常建议优先使用 String 构造方法;
  3. 静态方法 valueOf(double val) 内部实现,仍是将 double 类型转为 String 类型; 这通常是将 double(或float)转化为 BigDecimal 的首选方法;

测试代码如下:

package com.qiyuan.util;import java.math.BigDecimal;public class orderCode {public static void main(String[] args) {double d1 = 0.10334;double d2 = 1234.0;System.out.println("new BigDecimal("+d1+")=" + new BigDecimal(d1)); //此种方式绝对不允许!!!!!System.out.println("new BigDecimal("+d2+")=" + new BigDecimal(d2)); //此种方式绝对不允许!!!!!System.out.println("");System.out.println("new BigDecimal(String.valueOf("+d1+"))=" + new BigDecimal(String.valueOf(d1)));System.out.println("new BigDecimal(String.valueOf("+d2+"))=" + new BigDecimal(String.valueOf(d2)));System.out.println("");System.out.println("new BigDecimal(String.valueOf("+d1+"))=" + new BigDecimal(Double.toString(d1)));System.out.println("new BigDecimal(String.valueOf("+d2+"))=" + new BigDecimal(Double.toString(d2)));System.out.println("");System.out.println("BigDecimal.valueOf("+d1+")=" + BigDecimal.valueOf(d1));System.out.println("BigDecimal.valueOf("+d2+")=" + BigDecimal.valueOf(d2));System.out.println("");BigDecimal b1 = BigDecimal.valueOf(1);BigDecimal b2 = BigDecimal.valueOf(1.00000);System.out.println(b1.equals(b2));System.out.println(b1.compareTo(b2));}}

输出如下:

new BigDecimal(0.10334)=0.10334000000000000130118138486068346537649631500244140625
new BigDecimal(1234.0)=1234new BigDecimal(String.valueOf(0.10334))=0.10334
new BigDecimal(String.valueOf(1234.0))=1234.0new BigDecimal(String.valueOf(0.10334))=0.10334
new BigDecimal(String.valueOf(1234.0))=1234.0BigDecimal.valueOf(0.10334)=0.10334
BigDecimal.valueOf(1234.0)=1234.0false
0

二、BigDecimal保留小数位

public static void main(String[] args) throws IllegalAccessException {BigDecimal decimal = new BigDecimal("1.12345");System.out.println(decimal);BigDecimal setScale = decimal.setScale(4,BigDecimal.ROUND_HALF_DOWN);System.out.println(setScale);BigDecimal setScale1 = decimal.setScale(4,BigDecimal.ROUND_HALF_UP);System.out.println(setScale1);
}

在这里插入图片描述

参数定义ROUND_CEILING 
Rounding mode to round towards positive infinity. 
向正无穷方向舍入 ROUND_DOWN 
Rounding mode to round towards zero. 
向零方向舍入 ROUND_FLOOR 
Rounding mode to round towards negative infinity. 
向负无穷方向舍入 ROUND_HALF_DOWN 
Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round down. 
向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5 ROUND_HALF_EVEN 
Rounding mode to round towards the "nearest neighbor" unless both neighbors are equidistant, in which case, round towards the even neighbor. 
向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP ,如果是偶数,使用ROUND_HALF_DOWN ROUND_HALF_UP 
Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round up. 
向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6 ROUND_UNNECESSARY 
Rounding mode to assert that the requested operation has an exact result, hence no rounding is necessary. 
计算结果是精确的,不需要舍入模式 ROUND_UP 
Rounding mode to round away from zero. 
向远离0的方向舍入

附件1,BigDecimal 类的 valueOf()方法源码

public static BigDecimal valueOf(double val) {return new BigDecimal(Double.toString(val));
}

附件2,BigDecimal类的几个常用方法

/*** 求余数* 返回值为 (this % divisor) 的 BigDecimal*/
BigDecimal remainder(BigDecimal divisor);/*** 求相反数* 返回值是 (-this) 的 BigDecimal*/
BigDecimal negate();/*** 将此 BigDecimal 与指定的 BigDecimal 比较* 根据此方法,值相等但具有不同标度的两个 BigDecimal 对象(如,2.0 和 2.00)被认为是相等的;* 相对六个 boolean 比较运算符 (<, ==, >, >=, !=, <=) 中每一个运算符的各个方法,优先提供此方法;* 建议使用以下语句执行上述比较:(x.compareTo(y) <op> 0), 其中 <op> 是六个比较运算符之一;** 指定者:接口 Comparable<BigDecimal> 中的 compareTo* 返回:当此 BigDecimal 在数字上小于、等于或大于 val 时,返回 -1、0 或 1*/
int compareTo(BigDecimal val);

附件3,提供精确的浮点数运算(包括加、减、乘、除、四舍五入)的工具类源码

package com.qiyuan.util;import java.math.BigDecimal;public class ArithUtil {// 除法运算默认精度  private static final int DEF_DIV_SCALE = 10;  private ArithUtil() {  }  /** * 精确加法 */  public static double add(double value1, double value2) {  BigDecimal b1 = BigDecimal.valueOf(value1);  BigDecimal b2 = BigDecimal.valueOf(value2);  return b1.add(b2).doubleValue();  }  /** * 精确减法 */  public static double sub(double value1, double value2) {  BigDecimal b1 = BigDecimal.valueOf(value1);  BigDecimal b2 = BigDecimal.valueOf(value2);  return b1.subtract(b2).doubleValue();  }  /** * 精确乘法 */  public static double mul(double value1, double value2) {  BigDecimal b1 = BigDecimal.valueOf(value1);  BigDecimal b2 = BigDecimal.valueOf(value2);  return b1.multiply(b2).doubleValue();  }  /** * 精确除法 使用默认精度 */  public static double div(double value1, double value2) throws IllegalAccessException {  return div(value1, value2, DEF_DIV_SCALE);  }  /** * 精确除法 * @param scale 精度 */  public static double div(double value1, double value2, int scale) throws IllegalAccessException {  if(scale < 0) {  throw new IllegalAccessException("精确度不能小于0");  }  BigDecimal b1 = BigDecimal.valueOf(value1);  BigDecimal b2 = BigDecimal.valueOf(value2);  // return b1.divide(b2, scale).doubleValue();  return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();  }  /** * 四舍五入 * @param scale 小数点后保留几位 */  public static double round(double v, int scale) throws IllegalAccessException {  return div(v, 1, scale);  }  /** * 比较大小 */  public static boolean equalTo(BigDecimal b1, BigDecimal b2) {  if(b1 == null || b2 == null) {  return false;  }  return 0 == b1.compareTo(b2);  }  public static void main(String[] args) throws IllegalAccessException {double value1=1.2345678912311;double value2=9.1234567890123;BigDecimal value3=new BigDecimal(Double.toString(value1));BigDecimal value4=new BigDecimal(Double.toString(value2));System.out.println("精确加法================="+ArithUtil.add(value1, value2));System.out.println("精确减法================="+ArithUtil.sub(value1, value2));System.out.println("精确乘法================="+ArithUtil.mul(value1, value2));System.out.println("精确除法 使用默认精度 ================="+ArithUtil.div(value1, value2));System.out.println("精确除法  设置精度================="+ArithUtil.div(value1, value2,20));System.out.println("四舍五入   小数点后保留几位 ================="+ArithUtil.round(value1, 10));System.out.println("比较大小 ================="+ArithUtil.equalTo(value3, value4));}
}

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

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

相关文章

java中的生产者消费者模式详解

方式 一&#xff1a; Synchronized方式 注&#xff1a;此种方式会造成资源的浪费&#xff1a; 利用锁的notifyAll()方法会将所有的线程都唤醒&#xff0c;会造成资源的浪费 class Resource {private String name;private int count 1;private boolean flag false;public syn…

Python IO 基本编程示例

一. 基本概念 同步和异步 同步&#xff1a;CPU 等待 IO 的执行结果 异步&#xff1a;CPU 不等待 IO 的执行结果 即&#xff1a;同步和异步的区别就是是否等待 IO 执行的结果 回调模式 打个比方&#xff1a;汉堡做好后&#xff0c;服务员跑来告诉你&#xff0c;这就是回调 轮询…

mysql中in的用法详解

mysql中in的用法详解 一、基础用法 mysql中in常用于where表达式中&#xff0c;其作用是查询某个范围内的数据。 select * from where field in (value1,value2,value3,…)当 IN 前面加上 NOT 运算符时&#xff0c;表示与 IN 相反的意思&#xff0c;即不在这些列表项内选择 s…

keyProperty=“id“ 和useGeneratedKeys=“true“作用

keyProperty“id“ 和useGeneratedKeys“true“作用 使用 mysql 自增长序列&#xff0c;新插入一条数据时&#xff0c;怎么得到主键&#xff1f; 加入以下属性即可&#xff1a; useGeneratedKeys“true” keyProperty“id” <insert id"insertSelective" para…

mvn install:install-file将本地一个中央仓库没有的jar包,推到本地仓库----所有依赖不上仓库不能用

mvn install:install-file将本地一个中央仓库没有的jar包&#xff0c;推到本地仓库----所有依赖不上仓库不能用! 前提&#xff1a;maven等环境配置Ok 目标&#xff1a;把中央仓库没有的&#xff0c;部门内部 自研开发的jar&#xff0c;推到私服或者本地服务器&#xff0c;给相…

ZooKeeper 的工作流程

ZooKeeper 集群中的角色简介&#xff1a; Leader&#xff1a; 负责发起投票和决议&#xff0c;更新系统状态Follower&#xff1a;用于接收客户端请求并向客户端返回结果&#xff0c;在选主过程中参与投票Observer&#xff1a; 可以接收客户端连接&#xff0c;将写请求转发给 L…

TikTok真题第4天 | 1366. 通过投票对团队排名、1029.两地调度、562.矩阵中最长的连续1线段

1366. 通过投票对团队排名 题目链接&#xff1a;rank-teams-by-votes/ 解法&#xff1a; 这道题就是统计每个队伍在每个排名的投票数&#xff0c;队伍为A、B、C&#xff0c;则排名有1、2、3&#xff0c;按照投票数进行降序排列。如果有队伍在每个排名的投票数都一样&#xf…

idea Maven图标的使用

idea Maven图标的使用

动态规划算法之数塔问题

package cn.gldwolf.bigdata;/* 3 12 56 23 4 78 34 69 34 19 12 3 54 12 34 *//* 思路&#xff1a;从最底层往上走&#xff0c;判断下层两个节点中的最大值&#xff0c; 并将最大值与上层节点中的值相加得到这一步的最大值&#xff0c; 将最大值保存到新的数塔中 …

Log4j 配置详解

1. Log4j 简介 Log4j 有三个主要的组件&#xff1a; Loggers&#xff08;记录器&#xff09;&#xff1a;日志类别和级别 Appenders&#xff08;输出源&#xff09;&#xff1a;日志要输出的地方 Layouts&#xff08;布局&#xff09;&#xff1a;日志以何种形式输出 1.1 Log…

Iterator主要有三个方法:hasNext()、next()、remove()详解

Iterator主要有三个方法&#xff1a;hasNext()、next()、remove()详解 一、Iterator的API 关于Iterator主要有三个方法&#xff1a;hasNext()、next()、remove()hasNext:没有指针下移操作&#xff0c;只是判断是否存在下一个元素next&#xff1a;指针下移&#xff0c;返回该指…

Java获取登录用户IP地址

Java获取登录用户IP地址 /*** param * return * throws * description * author wqd* date 2021/9/21 13:45*/public static String getIpAddr(HttpServletRequest request) {String ip request.getHeader("x-forwarded-for");if (ip null || ip.length() 0 || &q…

Kafka Shell 基本操作

1. 启动集群每个节点的进程 nohup kafka-server-start.sh \ /home/hadoop/apps/kafka_2.11-1.1.0/config/server.properties \ 1>~/logs/kafka_std.log \ 2>~/logs/kafka_err.log &2. 创建 Topic 解释说明&#xff1a; –create --> 创建 Topic 的选项 –zookee…

Spark 简介

1. 什么是 Spark 官网&#xff1a;http://spark.apache.org Spark 是一个快速、通用、可扩展的大数据分析引擎。 Spark 是基于内存计算的大数据并行计算框架 1.1 Spark 的特点 快&#xff1a;与 Hadoop 的 MapReduce 相比&#xff0c;Spark 基于内存的运算要快 100 倍以上&a…

Linux环境下安装Mysql5.7

本文记录下我近期在Linux环境下安装Mysql5.7的实践经历。 服务器版本Mysql版本Centos 7.65.7.32 1. 下载Mysql 下载地址&#xff1a;https://downloads.mysql.com/archives/community/ 进入页面后选择你需要的版本进行下载&#xff0c;这里提供了2种格式&#xff1a;tar.gz和…

Redis 入门及实战

目录 1. Redis 基本概念 2. Redis 的优势 3. Redis 适用场景 4. Redis-3.2.6 安装(未整理)与测试 5. 使用 Redis 的 Java API 客户端——Jedis 6. 数据结构 6.1 String -- 字符串 6.1.1 String 使用概述 6.1.2 String 常用操作 6.1.3 String 使用案例 6.2 List -- 列…

HBase 简介

HBase 是一个通过大量廉价机器解决海量数据的调整存储和读取的分布式数据库解决方案 HBase 的特点&#xff1a; 高并发&#xff0c;易扩展&#xff0c;解决海量数据集的随机实时增删改查HBase 本质依然是 Key-Value 数据库&#xff0c;不支持 join 等复杂操作不支持复杂的事务…

Flink官网自学笔记

1. What is Apache Flink? Apache Flink 是一款用来进行分布式流数据和批数据处理的开源平台。Apache Flink 是一个对有界数据流和无界数据流进行有状态计算的框架和分布式处理引擎。Flink 被设计用于在所有常见的集群环境中运行&#xff0c;以内存中的速度和任意规模进行计算…

HBase Java API 代码开发

1. API 介绍 几个主要 HBase API 类和数据模型之间的对应关系&#xff1a; Java 类 HBase 数据模型 Admin 数据库&#xff08;Database&#xff09; HBaseConfiguration Table 表&#xff08;Table&#xff09; HTableDescriptor 列簇&#xff08;Column Family&#…

HBase 原理

1. HBase 底层原理 1.1 系统架构 1.1.1 Client 职责 1. HBase 有两张特殊的表&#xff1a; .META.: 记录了用户所有表拆分出来的 Region 映射信息&#xff0c;.META. 可以有多个 Region -ROOT-(新版中已去掉这一层): 记录了 .META. 表的 Region 信息&#xff0c;-ROOT- 只有…