A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lingdu 中级黑马   /  2015-5-15 22:30  /  556 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

java.math.BigDecimal类的用法



在java中提供了大数字的操作类,即java.math.BinInteger类和java.math.BigDecimal类。这两个类用于高精度计 算,其中BigInteger类是针对大整数的处理类,而BigDecimal类则是针对大小数的处理类。下边我们介绍BigDecimal类:
BigDecimal的实现利用到了BigInteger,不同的是BigDecimal加入了小数的概念。一般的float型和Double型数据只可 以用来做科学计算或者是工程计算,由于在商业计算中,要求的数字精度比较高,所以要用到java.math.BigDecimal类,它支持任何精度的定 点数,可以用它来精确计算货币值。下边我们通过举例简单介绍它的用法

java.math.BigDecimal的用法



1,BigInteger属于java.math.BigInteger,因此在每次使用前都要import 这个类。偶开始就忘记import了,于是总提示找不到提示符。

2,其构造方法有很多,但现在偶用到的有:
BigInteger(String val)
          将 BigInteger 的十进制字符串表示形式转换为 BigInteger。
BigInteger(String val, int radix)
          将指定基数的 BigInteger 的字符串表示形式转换为 BigInteger。
如要将int型的2转换为BigInteger型,要写为BigInteger two=new BigInteger("2"); //注意2双引号不能省略

3,BigInteger类模拟了所有的int型数学操作,如add()==“+”,divide()==“-”等,但注意其内容进行数学运算时不能直接使用数学运算符进行运算,必须使用其内部方法。而且其操作数也必须为BigInteger型。
如:two.add(2)就是一种错误的操作,因为2没有变为BigInteger型。

4,当要把计算结果输出时应该使用.toString方法将其转换为10进制的字符串,详细说明如下:
String toString()
          返回此 BigInteger 的十进制字符串表示形式。
输出方法:System.out.print(two.toString());

5,另外说明三个个用到的函数。   
BigInteger remainder(BigInteger val)
          返回其值为 (this % val) 的 BigInteger。
BigInteger negate()
          返回其值是 (-this) 的 BigInteger。
int        compareTo(BigInteger val)
          将此 BigInteger 与指定的 BigInteger 进行比较。
remainder用来求余数。
negate将操作数变为相反数。
compare的详解如下:
compareTo

public int compareTo(BigInteger val)

    将此 BigInteger 与指定的 BigInteger 进行比较。对于针对六个布尔比较运算符 (<, ==, >, >=, !=, <=) 中的每一个运算符的各个方法,优先提供此方法。执行这些比较的建议语句是:(x.compareTo(y) <op> 0),其中 <op> 是六个比较运算符之一。

     

    指定者:
        接口 Comparable<BigInteger> 中的 compareTo

    参数:
        val - 将此 BigInteger 与之比较的 BigInteger。
    返回:

   
  标题           在Java中实现浮点数的精确计算         AYellow(原作)   修改           
  关键字           Java   浮点数   精确计算         
   
   
  问题的提出:   
  如果我们编译运行下面这个程序会看到什么?   
  public   class   Test{   
          public   static   void   main(String   args[]){   
                  System.out.println(0.05+0.01);   
                  System.out.println(1.0-0.42);   
                  System.out.println(4.015*100);   
                  System.out.println(123.3/100);   
          }   
  };   
   
  你没有看错!结果确实是   
  0.060000000000000005   
  0.5800000000000001   
  401.49999999999994   
  1.2329999999999999   
   
  Java中的简单浮点数类型float和double不能够进行运算。不光是Java,在其它很多编程语言中也有这样的问题。在大多数情况下,计算的结果是准确的,但是多试几次(可以做一个循环)就可以试出类似上面的错误。现在终于理解为什么要有BCD码了。   
  这个问题相当严重,如果你有9.999999999999元,你的计算机是不会认为你可以购买10元的商品的。   
  在有的编程语言中提供了专门的货币类型来处理这种情况,但是Java没有。现在让我们看看如何解决这个问题。   
   
      
   
  四舍五入   
  我们的第一个反应是做四舍五入。Math类中的round方法不能设置保留几位小数,我们只能象这样(保留两位):   
  public   double   round(double   value){   
          return   Math.round(value*100)/100.0;   
  }   
   
  非常不幸,上面的代码并不能正常工作,给这个方法传入4.015它将返回4.01而不是4.02,如我们在上面看到的   
  4.015*100=401.49999999999994   
  因此如果我们要做到精确的四舍五入,不能利用简单类型做任何运算   
  java.text.DecimalFormat也不能解决这个问题:   
  System.out.println(new   java.text.DecimalFormat("0.00").format(4.025));   
  输出是4.02   
   
      
   

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马