Java基础:使用函数取精度

原创|其它|编辑:郝浩|2009-08-27 11:51:33.000|阅读 646 次

概述:前段时间做了一个关于Multiple Currency的项目。其中遇到了一些关于精度的问题。现在我就把其中学到的东西share一下。

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

  前段时间做了一个关于Multiple Currency的项目。其中遇到了一些关于精度的问题。现在我就把其中学到的东西share一下。

  举一个例子:

  在项目中。所有的item的price 是基于美元的。但是这个item的vendor又是属于Canada,要给加元,那么在计算amount的时候需要将price * count ,再将结果根据汇率转换成加元, 再取两位小数。

  例如:$1.45(Price) * 11(Count) = 15.95(Amount) * 1.2222222222(Exchange Rate) = 16.56567395 (Amount)

  最后 16.56567395 就是我们需要付的money。现在问题来了,再将16.56567395加元换回美元,偏差就出现了。这里就有人提出了关于取精度的问题,

  我所知道的有两种:四舍五入,四舍六入五成双。不知道大家有没有试过.net中自带的ToString与数字格式字符串。它所适用的就是四舍五入的方式来取整。但是它有一个弊病。如果多次进行转换。数值会偏高。不平衡。

  .net中还有一中方式就是Math.Round来取精度。 支持以上所说的两种机制。

  MidpointRounding.ToEven 四舍六入五成双

  MidpointRounding.AwayFromZero四舍五入

  当然最终解决方案是MidpointRounding.ToEven.

  什么叫四舍六入五成双?为什么用呢。四舍六入是一样的,五成双的意思就是,如果前面一个为偶数就忽略。为奇数就进一位,欧洲银行全采用这个算法,这样可以减少偏差

  总结:

  ToString默认采用四舍五入取精度,

  Math.Round 可以选择取精度方式.

  也许你们会提出为什么不从新计算一次Amount,就不用讲加元换成美元呢。业务复杂,改动风险大。


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:IT专家网

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP