java取精度,Java基础:使用函数取精度

前段时间做了一个关于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,就不用讲加元换成美元呢。业务复杂,改动风险大。

标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,尊重他人劳动成果

文章转载自:IT专家网

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值