电话:0731-83595998
导航

关于BigDecimal的不精确计算问题

来源: 2017-12-19 16:31

 百度广告

  考试吧整理Java认证辅导资料

  关于BigDecimal 的不精确计算问题

  view plaincopy to clipboardprint?

  public static void main(String args){

  BigDecimal bg1 = new BigDecimal(100.91);

  BigDecimal bg2 = new BigDecimal(5);

  BigDecimal bg3 = bg1.multiply(bg2);

  System.out.println(bg3);

  }

  public static void main(String args){

  BigDecimal bg1 = new BigDecimal(100.91);

  BigDecimal bg2 = new BigDecimal(5);

  BigDecimal bg3 = bg1.multiply(bg2);

  System.out.println(bg3);

  }

  输入结果为 504.549999999999982946974341757595539093017578125

  实际结果应为 504.55

  现在作了如下函数,可以解决一部分处理,但是测试时,有些case,还是有不精确的时候

  比如 0.123 和 5E10相乘 scale设置为10的时候,小数部分并不全为零

  public static int getLongLength(BigDecimal numericalValue){

  String sNumericalValue = numericalValue.toPlainString();

  String arrayValues = { "", "" };

  if (!(sNumericalValue.indexOf(".") < 0)) {

  arrayValues = sNumericalValue.split(""".");

  } else {

  arrayValues[0] = sNumericalValue;

  }

  if(arrayValues[0].contains("-")){

  arrayValues[0] = arrayValues[0].replaceAll("-", "");

  }

  int intLength = arrayValues[0].length();

  return intLength;

  }

  public static BigDecimal muliply(BigDecimal bg1,BigDecimal bg2,int scale,RoundingMode roundingMode){

  BigDecimal result = bg1.multiply(bg2);

  int intLength = getLongLength(result);

  MathContext context = new MathContext(intLength+scale,roundingMode);

  result = result.round(context);

  return result;

  }

  public static int getLongLength(BigDecimal numericalValue){

  String sNumericalValue = numericalValue.toPlainString();

  String arrayValues = { "", "" };

  if (!(sNumericalValue.indexOf(".") < 0)) {

  arrayValues = sNumericalValue.split(""".");

  } else {

  arrayValues[0] = sNumericalValue;

  }

  if(arrayValues[0].contains("-")){

  arrayValues[0] = arrayValues[0].replaceAll("-", "");

  }

  int intLength = arrayValues[0].length();

  return intLength;

  }

  public static BigDecimal muliply(BigDecimal bg1,BigDecimal bg2,int scale,RoundingMode roundingMode){

  BigDecimal result = bg1.multiply(bg2);

  int intLength = getLongLength(result);

  MathContext context = new MathContext(intLength+scale,roundingMode);

  result = result.round(context);

  return result;

  }需要特别指出的是 numericalValue.toPlainString(); toPlainString() 不会返回XXEXX的科学技术法的形式

编辑推荐:

下载Word文档

温馨提示:因考试政策、内容不断变化与调整,长理培训网站提供的以上信息仅供参考,如有异议,请考生以权威部门公布的内容为准! (责任编辑:长理培训)

网络课程 新人注册送三重礼

已有 22658 名学员学习以下课程通过考试

网友评论(共0条评论)

请自觉遵守互联网相关政策法规,评论内容只代表网友观点!

最新评论

点击加载更多评论>>

精品课程

更多
10781人学习

免费试听更多

相关推荐
图书更多+
  • 电网书籍
  • 财会书籍
  • 其它工学书籍
拼团课程更多+
  • 电气拼团课程
  • 财会拼团课程
  • 其它工学拼团
热门排行

长理培训客户端 资讯,试题,视频一手掌握

去 App Store 免费下载 iOS 客户端