欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java中BigDecimal类的简单用法

程序员文章站 2024-03-01 13:38:28
本文实例讲述了java中bigdecimal类的简单用法,是java程序设计中非常实用的技巧,分享给大家供大家参考。具体用法分析如下: 一般来说,一提到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程序设计的学习有所帮助。