码迷,mamicode.com
首页 > 其他好文 > 详细

BigDecimal使用整理

时间:2018-08-20 10:33:30      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:string   result   使用   浮点数   超过   1.2   mes   导致   不能   

BigDecimal使用整理

一、     BigDecimal简介

计算机计算中无论是float还是double都是浮点数,由于计算机是二进制的,导致在在浮点数计算时会出现精度丢失,因此引入BigDecimaljava.math.BigDecimal)。

Javajava.math包中提供的 APIBigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。floatdouble只能用来做科学计算或者是工程计算,在商业计算中要用 java.math.BigDecimal(BigDecimal)所创建的是对象,我们不能使用传统的+-*/等算术运算符直接对其对象进行数学运算,而必须调用BigDecimal相对应的方法。方法中的参数也必须是BigDecimal的对象。

 

二、     BigDecimal构造方法

Bigdecimal构造时,不要直接使浮点数作为构造方法的参数,这样会出现精度丢失的问题。

      Bigdecimal构造时使用BigDecimal.valueOf()方法,或者使用字符串作为BigDecimal构造方法的参数,避免精度丢失的问题。

例如:

?  BigDecimal b1 = new BigDecimal("1.23");//1.23

?  BigDecimal b2 = BigDecimal.valueOf(1.23);//1.23

?  BigDecimal b3 = new BigDecimal(String.valueof(1.23));//1.23

精度丢失例如:

BigDecimal one1 = new BigDecimal(1.23); // 则结果会出现精度问题, 相应值会变成1.229999999999999982236431605997495353221893310546875
 

另外除了这两种外,特殊的像0110可以这样写。

1.  BigDecimal zero = BigDecimal.ZERO;

2.  BigDecimal one  = BigDecimal.ONE;

3.  BigDecimal ten  = BigDecimal.TEN;

 

三、      BigDecimal的加减乘除运算
?  public BigDecimal add(BigDecimal value); // 加法
?  public BigDecimal subtract(BigDecimal value); // 减法 
?  public BigDecimal multiply(BigDecimal value); // 乘法
?  public BigDecimal divide(BigDecimal value); // 除法
 
BigDecimal的运算都没有对原值进行操作,而是返回一个新的BigDecimal对象。
 
四、      BigDecimal的比较方法(compareToequals对比)

BigDecimal在数字上小于等于或大于被比较对象时,返回 -10 1

例如:

BigDecimal one = BigDecimal.valueOf(1);

BigDecimal two = new BigDecimal("2");

BigDecimal three = one.add(two);

int i1 = one.compareTo(two);     // -1

int i2 = two.compareTo(two);     // 0

int i3 = three.compareTo(two);   // 1

注意值相等但具有不同精度的两个BigDecimal对象(如,1.0 1.00)被认为是相等的。

 

注意BigDecimal的比较运算最好不要用equals实现,因为BigDecimalequals方法在比较的时候要比较两个数值的精度。

   // 精度不同,数值不相等

BigDecimal decimal1 = BigDecimal.valueOf(0);

BigDecimal decimal2 = new BigDecimal("0.00");

System.out.println("the result is " +decimal1.equals(decimal2)); // false

 

    // 设置为相同精度后再次比较

BigDecimal decimal3 = BigDecimal.valueOf(0).setScale(2);

BigDecimal decimal4 = new BigDecimal("0.00").setScale(2);

System.out.println("the result is " +decimal3.equals(decimal4)); // true

 

使用BigDecimalequals方法判断两个BigDecimal类型的数据时,需要设置精度,否则结果可能不正确

 

 
 

BigDecimal使用整理

标签:string   result   使用   浮点数   超过   1.2   mes   导致   不能   

原文地址:https://www.cnblogs.com/widget90/p/9504012.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!