BigDecimal_用于高精度计算.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
BigDecimal_用于高精度计算

BigDecimal_用于高精度计算 Java中使用BigDecimal进行浮点数高精度计算 咨询java中金额的精确计算问题 实战java中资金计算的要点-BigDecimal 推荐群组: 极英连大科瑞迪特 更多相关推荐 Java中的简单浮点数类型float和double不能够进行运算。不光是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 BigDecimal 在《Effective Java 》这本书中也提到这个原则,float 和double 只能用来做科学计算或者是工程计算,在商业计算中我们要用java.math.BigDecimal 。BigDecimal 一共有4 个够造方法,我们不关心用BigInteger 来够造的那两个,那么还有两个,它们是: BigDecimal(double val) Translates a double into a BigDecimal. BigDecimal(String val) Translates the String repre sentation of a BigDecimal into a BigDecimal. 上面的API 简要描述相当的明确,而且通常情况下,上面的那一个使用起来要方便一些。我们可能想都不想就用上了,会有什么问题呢?等到出了问题的时候,才发现上面哪个够造方法的详细说明中有这么一段: Note: the results of this constructor can be somewhat unpredictable. One might assume that new BigDecimal(.1) is exactly equal to .1, but it is actually equal to .1000000000000000055511151231257827021181583404541015625. This is so because .1 cannot be represented exactly as a double (or, for that matter, as a binary fraction of any finite length). Thus, the long value th

文档评论(0)

f8r9t5c + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8000054077000003

1亿VIP精品文档

相关文档