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

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

float double 类型 转为 int 类型时

它会丢掉小数部分。

比如 (int)5.5f

输出结果会是5

unity 开门动画 不在原点_unity 开门动画 不在原点

mathf. .RoundToInt()

遇到偶数会返回偶数。

传入11.5f 的结果是 12

unity 开门动画 不在原点_Unity_02


传入10.5f 的结果是 10

unity 开门动画 不在原点_银行家算法_03

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等等,则是使用银行家算法