Unity Mathf.RoundToInt 左开右闭 银行家算法

四舍五入与 银行家 四舍五入

1) unity的 四舍五入与 mathf.RoundToInt()

float double 类型 转为 int 类型时
它会丢掉小数部分。
比如 (int)5.5f
输出结果会是5在这里插入图片描述

mathf. .RoundToInt()
遇到偶数会返回偶数。
传入11.5f 的结果是 12
在这里插入图片描述
传入10.5f 的结果是 10在这里插入图片描述

2)历史背景

为什么要这样做的原因 转:
http://blog.itpub.net/29512902/viewspace-1179479/
尽管知道了这些,但却从来没有深入的想,为什么要这么做。

偶然间,遇到了一个业务方面的问题,有客户反映,一个业务系统产生了两组数据:
第一组,(销售,成本,毛利)=(0.75,0.68,0.08),销售不等于成本和毛利的和,其原因是:
售价50,进价45,数量是0.015,这样计算得到的成本是0.675,毛利是0.075,成本和毛利两个字段都是number(19,2),都五入导致;
第二组,(销售,成本,毛利)=(0.85,0.77,0.09),也是销售不等于成本和毛利的和,原因同样是:
售价50,进价45,数量是0.017,这样计算得到的成本是0.765,毛利是0.085,成本和毛利都五入导致;

这时,才深入思考了一下银行家算法。

按常规的四舍五入算法
…… ……
[0.5,1.5) = 1
[1.5,2.5) = 2
[2.5,3.5) = 3
[3.5,4.5) = 4
[4.5,5.5) = 5
[5.5,6.5) = 6
…… ……
那么,较真的人就会问,为什么是左闭右开,而不采用左开右闭?其实道理是一样的,左闭右开会让恰好为n+0.5的数值全部入,而左开右闭则全部舍。
总之,两者都会使数值有向一端的倾向性。所以,就有人提出银行家算法。
银行家算法
…… ……
(0.5,1.5) = 1
[1.5,2.5] = 2
(2.5,3.5) = 3
[3.5,4.5] = 4
(4.5,5.5) = 5
[5.5,6.5] = 6
…… ……
这样,隔一个n+0.5数值入,隔一个舍,从而使数值趋于均衡.
以上面两组数据为例,得到的结果是:
第一组,(销售,成本,毛利)=(0.75,0.68,0.08)
第二组,(销售,成本,毛利)=(0.85,0.76,0.08)
虽然仍然是不相等,但看整体效果(两行加起来),1.60=1.44+0.16则是相等的.

这儿,说明一下,Oracle的四舍五入是常规算法.而一些开发工具,比如VB、Delphi等等,则是使用银行家算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值