报课、招生咨询电话:010-51268840/41

首页 > 计算机考试 > JAVA考试认证 >
→论坛登陆 用户名  密码  
关于BigDecimal的不精确计算问题

作者: 发布时间:2008-07-17 16:50:35 来源:育路计算机考试频道
关于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的科学技术法的形式

    育路网
 
 
                                        
评论】【加入收藏夹】【 】【打印】【关闭
育路网2007年夏令营联展
 更多有关新闻:
 
·[考试动态2008年医师资格考试网上报名须知 ·[考试动态2008年医师资格考试3月10日开始网
·[考试动态卫生部医师资格考试委员会公告 ·[考试动态2008年医师考试于9月20至21进行
·[考试动态关于北京考区2008年度国家医师资 ·[考试动态崇文区卫生局关于北京考区2008年
·[考试动态丰台区卫生局关于北京考区2008年 ·[考试动态2008年上海市医师资格考试(考区
·[考试动态2008年医师资格考试(天津考区) ·[考试动态惠州市卫生局关于2008医师资格考
·[考试动态无锡市关于2008年医师资格考试网 ·[考试动态关于珠海市2008年医师资格考试的
·[考试动态韶关市关于2008年医师资格考试网 ·[考试动态深圳市关于2008年医师资格考试深
·[考试动态杭州市卫生局关于2008年医师资格 ·[考试动态丽水市关于2008年医师资格考试报
发表评论
用户名: 密码:
验证码: 匿名发表
课程搜索:
选择分类:
课程关键字:
课程 学校
 2008年首都高校秋季招生
北京理工大学2008年招生简章
北京文理研修学院2008年招生简章
北京建设大学2008年招生简章
北京中山学院2008年招生简章
北京城市学院2008年招生简章
培黎职业学院2008年招生简章
北京金融学院2008年招生简章
北京吉利大学2008年招生简章
北方工商管理学院2008年招生简章
 本周推荐课程
·初中起点雅思半年脱产 ·启德雅思6分冲刺课程
·新概念1+2册慢速精讲课 ·环球新托福100分强化
·北文王长喜四级强化班 ·英语四、六级培训课程
·海文考研数学课程 ·海文考研英语课程
·北大企业管理高级研修班 ·清华企业领导人研修班
·中美高中生交换项目 ·北工大中加学院2+2本科
·劳动和社会保障部物流师 ·物业管理师职业培训
·市场营销经理国际资格 ·现场管理实务培训
清华大学留学
中法管理硕士预科班
课程咨询热线:010-51268840 51268841
 最新新闻
·经济增长的好处不能过度向公务员倾斜
·国家公务员局五个内设机构设置顺利完成
·北京广电局2008年招考公务员公告
· 北京广电局2008年招考公务员公告
·德国成世界第三大留学国 中国学生最多
·记点积分制:积95分可留英工作两年
·美国多所大学到中国选保送生
·宁夏定向招录95名公务员 7月18日起报名
·云南政法机关定向招录349名公务员
·2009年国家公务员暑期行测基础2班开班通知
 育路社区            进入>>
 
学员报名服务中心: 北京北三环西路32号恒润中心1806(交通位置图
咨询电话:北京- 010-51268840/41 传真:010-51418040 上海-021-64392659、64397431
育路网-中国新锐教育社区: 北京站 | 上海站 | 郑州站| 武汉站
本站法律顾问: 邱清荣律师
北京育路互联科技有限公司版权所有 | 京ICP备05012189号