熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

關於BigDecimal的不精確計算問題

2013-11-23 19:07:07  來源: Java核心技術 

  關於BigDecimal 的不精確計算問題

  view plaincopy to clipboardprint?
    public static void main(String[] args){

  BigDecimal bg = new BigDecimal();

  BigDecimal bg = new BigDecimal();

  BigDecimal bg = bgmultiply(bg);

  Systemoutprintln(bg);

  }

  public static void main(String[] args){

  BigDecimal bg = new BigDecimal();

  BigDecimal bg = new BigDecimal();

  BigDecimal bg = bgmultiply(bg);

  Systemoutprintln(bg);

  }

  輸入結果為

  實際結果應為

  現在作了如下函數可以解決一部分處理但是測試時有些case還是有不精確的時候

  比如 E相乘 scale設置為的時候小數部分並不全為零

  public static int getLongLength(BigDecimal numericalValue){

  String sNumericalValue = numericalValuetoPlainString();

  String[] arrayValues = { };

  if (!(sNumericalValueindexOf() < )) {

  arrayValues = sNumericalValuesplit(\\);

  } else {

  arrayValues[] = sNumericalValue;

  }

  if(arrayValues[ntains()){

  arrayValues[] = arrayValues[]replaceAll( );

  }

  int intLength = arrayValues[]length();

  return intLength;

  }

  public static BigDecimal muliply(BigDecimal bgBigDecimal bgint scaleRoundingMode roundingMode){

  BigDecimal result = bgmultiply(bg);

  int intLength = getLongLength(result);

  MathContext context = new MathContext(intLength+scaleroundingMode);

  result = resultround(context);

  return result;

  }

  public static int getLongLength(BigDecimal numericalValue){

  String sNumericalValue = numericalValuetoPlainString();

  String[] arrayValues = { };

  if (!(sNumericalValueindexOf() < )) {

  arrayValues = sNumericalValuesplit(\\);

  } else {

  arrayValues[] = sNumericalValue;

  }

  if(arrayValues[ntains()){

  arrayValues[] = arrayValues[]replaceAll( );

  }

  int intLength = arrayValues[]length();

  return intLength;

  }

  public static BigDecimal muliply(BigDecimal bgBigDecimal bgint scaleRoundingMode roundingMode){

  BigDecimal result = bgmultiply(bg);

  int intLength = getLongLength(result);

  MathContext context = new MathContext(intLength+scaleroundingMode);

  result = resultround(context);

  return result;

  }需要特別指出的是 numericalValuetoPlainString(); toPlainString() 不會返回XXEXX的科學技術法的形式


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26302.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.