VB6自定义银行家舍入
前段时间公司使用VB小工具的银行家舍入部分遇到了一些问题,对方公司的数据类型是Decimal类型,但是我们用的数据类型是Double。而且Double在运算的时候会出现些许的误差。双方在进行数据核对时,就造成了我方因为数据类型导致计算错误。无奈之下想出了一个笨办法,就是自定义一个银行家舍入,不用系统自带的Round()。代码如下:
Public Function DefRound(Num as double, digit as int) As Double
'''''''''''''''''''''''''''''''''''''''''''''''''
'制作人:Roy; 制作日期:2012-11-01 ''
'银行家舍入规则:四舍六入五考虑,五后非零就进一''
'五后为零看奇偶,五前为偶应舍去,五前为奇要进一''
'''''''''''''''''''''''''''''''''''''''''''''''''
Dim tmp1 As Double
Dim tmp2 As Double
Dim result as Double
tmp1 = Num * 10 ^ (digit+2)
tmp2 = tmp1 \ 1
tmp2 = Right(CStr(tmp2), 2)
If CInt(tmp2) < 50 Then
result = (tmp1 \ 100) / 10 ^ digit
ElseIf CInt(tmp2) >= 60 Then
result = (tmp1 \ 100) / 10 ^ digit + (1/10^digit)
Else
tmp2 = tmp1 \ 100
tmp2 = Right(CStr(tmp2), 1)
If tmp2 Mod 2 = 1 Then
result = (tmp1 \ 100) / 10 ^ digit
Else
result = (tmp1 \ 100) / 10 ^ digit + (1/10^digit)
End If
DefRound=result
End Function
经过测试,功能是没问题,只是觉得这样貌似有点儿不太大方,所以想问问各位高人,有没有什么更好的办法?
[最优解释]
用 Currecy 类型就很好,专门为金融设计的类型。
[其他解释]
看过VC写的四舍五入的代码吗?可以产靠一下的
[其他解释]
厄……,我们的数据是需要保留4位小数,从第五位开始使用银行家舍入进行精确,但是Currency类型本身就只保留4位小数,也就是说没等我们舍入,他自己就已经帮我们进行取舍了,所以没法用。
不过还是谢谢你,我也是试过之后才知道的。
[其他解释]
是指“ (x+0.5)/1”吗?还是Round方法?(x+0.5)/1的话,因为四舍五入相对简单,只需要和5比较就好了,但是银行家舍入比较麻烦,需要跟4,5,6比较,如果是5的话,还得看5后面是否为0,要是为0还得看5前面是奇数还是偶数,需要比较的阈值比较多。