Java中BigDecimal类的简单用法

 更新时间:2014年09月19日 12:09:25   投稿:shichen2014  
这篇文章主要介绍了Java中BigDecimal类的简单用法,是Java应用程序开发中非常实用的技巧,本文以实例形式对此进行了简单的分析,需要的朋友可以参考下

本文实例讲述了Java中BigDecimal类的简单用法,是Java程序设计中非常实用的技巧,分享给大家供大家参考。具体用法分析如下:

一般来说,一提到Java里面的商业计算,我们都知道不能用float和double,因为他们无法进行精确计算。但是Java的设计者给编程人员提供了一个很有用的类BigDecimal,他可以完善float和double类无法进行精确计算的缺憾。BigDecimal类位于java.maths类包下。首先我们来看下如何构造一个BigDecimal对象。它的构造函数很多,这里挑选最常用的两个来演示一下:一个就是BigDecimal(double val),另一个就是BigDecimal(String str)。这两个看上去没什么太大区别,但是正像API描述中说的那样:

/*The results of this constructor can be somewhat unpredictable. One might assume that 
new BigDecimal(.1) is exactly equal to .1, but it is actually equal 
to .1000000000000000055511151231257827021181583404541015625. This is so because .1 
cannot be represented exactly as a double (or, for that matter, as a binary fraction 
of any finite length). Thus, the long value that is being passed in to the constructor 
is not exactly equal to .1, appearances nonwithstanding.
The (String) constructor, on the other hand, is perfectly predictable: new BigDecimal
(".1") is exactly equal to .1, as one would expect. Therefore, it is generally 
recommended that the (String) constructor be used in preference to this one.*/

也就是说利用double作为参数的构造函数,无法精确构造一个BigDecimal对象,需要自己指定一个上下文的环境,也就是指定精确位。而利用String对象作为参数传入的构造函数能精确的构造出一个BigDecimal对象。请看下面的代码:

import java.math.*;
public class TestBigDecimal {
  public static void main(String args[]){
    BigDecimal bd = new BigDecimal("10.123");
    BigDecimal bd1 = new BigDecimal(10.123);
    System.out.println(bd +"/n"+ bd1);
  }
}

运行后输出:

10.123
10.1229999999999993320898283855058252811431884765625

所以我们在选择构造函数时,要看具体需求而定。

另外,很多人会问到怎么将基本类型,如int,float,double,long,和BigDecimal对象相互转换。很简单:

基本类型通过构造函数转换成对应的BigDecimal对象,而BigDecimal类提供了诸如intValue(), floatValue(), doubleValue(), longValue()方法来将BigDecimal对象转换成对应的值。

关于BigDecimal是如何计算的,我以论坛中一个人的提问帖子为例,来简单的写出BigDecimal的运算方法。题目是:李白无事街上走,提壶去买酒。遇店加一倍,见花喝一斗,五遇花和店,喝光壶中酒,试问李白壶中原有多少斗酒?

这道题应该是从后往前推,并且要逆运算,最后得出原有酒的体积。

import java.math.*;
public class Libai {
  public static void main(String args[]){
    BigDecimal volumn = new BigDecimal("0");
    for (int i=0; i<5; i++){      
      volumn = volumn.add(new BigDecimal("1"));
      volumn = volumn.divide(new BigDecimal("2"));
    }
    System.out.print(volumn);
  }
}

运行结果:

0.96875

希望本文所述对大家Java程序设计的学习有所帮助。

相关文章

  • 基于spring注入为null的原因及解决方案

    基于spring注入为null的原因及解决方案

    这篇文章主要介绍了spring注入为null的原因及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • RabbitMQ消费端ACK NACK及重回队列机制详解

    RabbitMQ消费端ACK NACK及重回队列机制详解

    这篇文章主要为大家介绍了RabbitMQ消费端ACK NACK及重回队列机制详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • @PathVariable为空时指定默认值的操作

    @PathVariable为空时指定默认值的操作

    这篇文章主要介绍了@PathVariable为空时指定默认值的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • sftp和ftp 根据配置远程服务器地址下载文件到当前服务

    sftp和ftp 根据配置远程服务器地址下载文件到当前服务

    这篇文章主要介绍了sftp和ftp 根据配置远程服务器地址下载文件到当前服务的相关资料本文给大家介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下
    2016-10-10
  • SpringBoot中的自定义Starter解读

    SpringBoot中的自定义Starter解读

    这篇文章主要介绍了SpringBoot中的自定义Starter解读,启动器模块其实是一个空的jar文件,里面没有什么类、接口,仅仅是提供辅助性依赖管理,这些依赖可能用于自动装配或者其他类库,需要的朋友可以参考下
    2023-12-12
  • Java 删除文件及文件夹删除不了的解决

    Java 删除文件及文件夹删除不了的解决

    这篇文章主要介绍了Java 删除文件及文件夹删除不了的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • SpringBoot构建Restful service完成Get和Post请求

    SpringBoot构建Restful service完成Get和Post请求

    这篇文章主要介绍了SpringBoot构建Restful service完成Get和Post请求的示例代码,感兴趣的朋友一起看看吧
    2017-08-08
  • 解析Java按值传递还是按引用传递

    解析Java按值传递还是按引用传递

    这篇文章主要介绍了解析Java按值传递还是按引用传递,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • Java 实战项目之在线点餐系统的实现流程

    Java 实战项目之在线点餐系统的实现流程

    读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用java+SSM+jsp+mysql+maven实现一个在线点餐系统,大家可以在过程中查缺补漏,提升水平
    2021-11-11
  • Java开发岗位面试被问到嵌套类怎么办

    Java开发岗位面试被问到嵌套类怎么办

    本篇文章主要介绍了深入理解Java嵌套类和内部类,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-07-07

最新评论