文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

BigDecimal怎么在Java中使用

2023-05-30 23:20

关注

这期内容当中小编将会给大家带来有关BigDecimal怎么在Java中使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高精度计算.
其中 BigInteger 类是针对大整数的处理类,而 BigDecimal 类则是针对大小数的处理类.

BigDecimal 类的实现用到了 BigInteger类,不同的是 BigDecimal 加入了小数的概念.

float和Double只能用来做科学计算或者是工程计算;在商业计算中,对数字精度要求较高,必须使用 BigInteger 类和 BigDecimal 类,它支持任何精度的定点数,可以用它来精确计算货币值.

BigDecimal类创建的是对象,不能使用传统的+、-、*、/等算术运算符直接对其进行数学运算,而必须调用其对应的方法.方法的参数也必须是BigDecimal类型的对象.

构造 BigDecimal 对象常用以下方法:

BigDecimal BigDecimal(double d); //不允许使用
BigDecimal BigDecimal(String s); //常用,推荐使用
static BigDecimal valueOf(double d); //常用,推荐使用

其中,

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

测试代码如下:

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.10334000000000000130118138486068346537649631500244140625new BigDecimal(1234.0)=1234new BigDecimal(String.valueOf(0.10334))=0.10334new BigDecimal(String.valueOf(1234.0))=1234.0new BigDecimal(String.valueOf(0.10334))=0.10334new BigDecimal(String.valueOf(1234.0))=1234.0BigDecimal.valueOf(0.10334)=0.10334BigDecimal.valueOf(1234.0)=1234.0false0

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

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

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

BigDecimal remainder(BigDecimal divisor);BigDecimal negate();int compareTo(BigDecimal val);

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

package com.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);}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();}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);}}

下面,总结下这次项目中BigDecimal的用法。

加减乘除
2.设置精度
3.取反

加减乘除分别调用函数

public BigDecimal add(BigDecimal value); public BigDecimal subtract(BigDecimal value); public BigDecimal multiply(BigDecimal value); public BigDecimal divide(BigDecimal value);

举例:

BigDecimal a=new BigDecimal(10.0); BigDecimal b=new BigDecimal(9.1); System.out.println(a.subtract(b));

精度设置,为什么会设置精度,给大家看个效果

代码如下

BigDecimal abig=new BigDecimal(10.0); BigDecimal bbig=new BigDecimal(9.1); BigDecimal cbig=new BigDecimal(8.9);  System.out.println(abig.subtract(bbig)); System.out.println(abig.subtract(cbig));

结果如下:

0.9000000000000003552713678800500929355621337890625 1.0999999999999996447286321199499070644378662109375

并不是我们希望看到的0.9和1.1,原因就是转成二进制的时候会有精度问题,导致这样的结果。所以我们可以在运算的时候加精度,也可以在实例化BigDecimal的时候用字符串。

设置精度的方法:

System.out.println(abig.subtract(bbig).setScale(2, BigDecimal.ROUND_HALF_UP)); System.out.println(abig.subtract(cbig).setScale(2, BigDecimal.ROUND_HALF_UP));

这样设置两位精度就可以啦

0.90 1.10

字符串实例化的方法:

BigDecimal abig=new BigDecimal("10.0"); BigDecimal bbig=new BigDecimal("9.1"); BigDecimal cbig=new BigDecimal("8.9");

取反

因为Bigdecimal是无法直接用+-*/这些符号进行计算的,所以取反的时候也需要一个单独的方法来实现:

System.out.println(abig.negate());

这样就会拿到它的相反数了:

-10.0

上述就是小编为大家分享的BigDecimal怎么在Java中使用了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯