关于四舍五入的问题——请各位领导帮忙呵呵谢谢
由于工作原因,我设计了一个小程序,用到四舍五入。但是又错误,请高手指教!
如下:
Private Sub Command1_Click()
Dim m, n As Double
n=4.6566248
n = Fix(n * 100) / 100 'text11
m = Right(Format((n * 100) / 100, "##.00"), 1)
print m
'为什么输出为0呢?????????????
If Val(m) > 4 Then
n = (Fix(n * 10) + 1) / 10
Else
n = Fix(n * 10) / 10
End If
print n
'为什么结果是4.6????/
问题点数:10、回复次数:23Top
1 楼unsigned(僵哥(发站内消息,请附上链接或问题说明,否则不予回复))回复于 2005-08-04 20:57:23 得分 0
呵呵,不知道哦,偶这结果是4.7^_^Top
2 楼truewill(无处不在)回复于 2005-08-04 21:43:39 得分 0
-_-|||
int(x*10+.5)/10
就好了,不要搞那么复杂Top
3 楼unsigned(僵哥(发站内消息,请附上链接或问题说明,否则不予回复))回复于 2005-08-04 23:30:16 得分 0
-_-|||
int(x*10+.5)/10
就好了,不要搞那么复杂
===========================
?round(1.565,2)
1.56
?int(1.565*100+0.5)/100
1.56
不过,偶这里可能是打了VB6滴SP6,使用Format倒还可以实现。
?format(1.565,"##.00")
1.57Top
4 楼unsigned(僵哥(发站内消息,请附上链接或问题说明,否则不予回复))回复于 2005-08-04 23:54:47 得分 0
?0.565*100+0.5-int(0.565*100+0.5)
.99999 99999 99995
这是浮点数的问题,所以并不好解决。
如果要求精确度不是太高滴话,比如普通的作业应用,那么也就精确到小数点后8位就够用了,则只要差额>0.999999999,则可以认为是1
Private Function Round(ByVal Value As Double, ByVal ADigit As Byte) As Double
Dim wValue As Double
Dim tValue As Double
Round = Value
wValue = Value * 10# ^ ADigit
tValue = Int(wValue + 0.5)
If tValue - wValue > 0.9999999999 Then tValue = tValue + 1
Round = tValue / 10# ^ ADigit
End FunctionTop
5 楼unsigned(僵哥(发站内消息,请附上链接或问题说明,否则不予回复))回复于 2005-08-04 23:55:18 得分 0
Private Function Round(ByVal Value As Double, ByVal ADigit As Byte) As Double
Dim wValue As Double
Dim tValue As Double
Round = Value
wValue = Value * 10# ^ ADigit + 0.5
tValue = Int(wValue)
If wValue - tValue > 0.99999999999999 Then tValue = tValue + 1
Round = tValue / 10# ^ ADigit
End FunctionTop
6 楼liuyh7788()回复于 2005-08-05 00:15:01 得分 0
Round 啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
Top
7 楼caozhy(cfx)回复于 2005-08-05 05:39:50 得分 0
Round 就是做四舍五入的嘛。Top
8 楼xayzmb(行者)回复于 2005-08-05 08:05:26 得分 0
round是得不到你想要的结果的
还得自已写
其实很简单
先确定你要保留几位小数(比如3位)
再检查小数点后要保留数字后面的那个数字是几(比如第4位数)
如果是>=5
就把第三位数加1
否侧不加
如此而已嘛Top
9 楼zyg0(影子(被评为本年度最可爱流氓)回复于 2005-08-05 10:04:03 得分 0
round是4舍6入,不是4舍5入Top
10 楼benoy(benoy)回复于 2005-08-05 10:38:51 得分 0
试以下用FotmatNumber 函数啊!或者可以帮到你Top
11 楼wxrwan(无奈小飞不耻上问)回复于 2005-08-05 10:55:30 得分 0
round是4舍6入,不是4舍5入
msdn上好好看看吧Top
12 楼zq972(最近不想写代码,好累~~~~)回复于 2005-08-05 11:16:21 得分 0
用format函数就好了
round确实不行Top
13 楼wsterran(拾叶)回复于 2005-08-05 11:39:51 得分 0
format函数好像自动就四舍五入
Top
14 楼yuechang8(恒昌)回复于 2005-08-05 20:31:39 得分 0
M为什么输出为0呢?
算法我懂,但是往往测试十个数,有一两个不正确哦.
请教僵哥,行者和诸位?Top
15 楼unsigned(僵哥(发站内消息,请附上链接或问题说明,否则不予回复))回复于 2005-08-05 22:42:26 得分 0
M为什么输出为0呢?
算法我懂,但是往往测试十个数,有一两个不正确哦.
请教僵哥,行者和诸位?
========================
这是浮点数的问题,在内存当中存储的问题。
回复人: zyg0(影子(成功减肥10斤,可给我饿坏了,我要补回来) ( ) 信誉:97
round是4舍6入,不是4舍5入
==========================
亏你还两颗星星,竟出这个谬论。
这要说也是“逢单舍四,逢又舍五”好不好?
Round(1.565,2)≈1.56
Round(1.565000000001,2)≈1.57
Round(1.575,2)≈1.58
即当保留位为双数时,若舍入值小于等于5,则舍去;当保留位为单数时,若舍入值小于5则舍去。
Top
16 楼unsigned(僵哥(发站内消息,请附上链接或问题说明,否则不予回复))回复于 2005-08-05 22:54:30 得分 0
通常情况下,若非工程计算,那么小数位数有八位就已经够用了,所以只须差值超过0.999999999就可以当做为差值为1,而上面本人所给出的自定义的Round函数已经基本够用,即使是
format(round(0.000000000000000000000000000000565,32),"0.000000000000000000000000000000000")
也能得到:
0.000000000000000000000000000000570,即5.7E-31
===============================================================
Private Function Round(ByVal Value As Double, ByVal ADigit As Byte) As Double
Dim wValue As Double
Dim tValue As Double
Round = Value
wValue = Value * 10# ^ ADigit + 0.5
tValue = Int(wValue)
If wValue - tValue > 0.99999999999999 Then tValue = tValue + 1
Round = tValue / 10# ^ ADigit
End FunctionTop
17 楼unsigned(僵哥(发站内消息,请附上链接或问题说明,否则不予回复))回复于 2005-08-05 23:32:34 得分 0
Private Function Round(ByVal Value As Double, ByVal ADigit As Byte) As Double
Dim wValue As Double
Dim tValue As Double
Round = Value
wValue = Value * 10# ^ ADigit + 0.5
tValue = Int(wValue)
If wValue - tValue > 0.99999999999999 Then tValue = tValue + 1
Round = tValue / 10# ^ ADigit
End Function
'-----------------------------------------
Dim t As Long
Dim k As Double
Dim b As Double
Dim s As Date
k = 5.65E-21
s = Now
For t = 21474836 To 0 Step -1
b = Round(k, 22)
Next
s = Now - s
Label1 = s '==========耗时24秒
k = 5.65E-21
s = Now
For t = 21474836 To 0 Step -1
b = Format(k, "0.0000000000000000000000")
Next
s = Now - s
Label2 = s '==========耗时1分32秒Top
18 楼yuechang8(恒昌)回复于 2005-08-06 21:33:59 得分 0
谢谢诸位,谢谢僵哥!
谢谢大家的帮助!
祝大家工作不累,天天happy!Top
19 楼yuechang8(恒昌)回复于 2005-08-06 21:48:15 得分 0
这要说也是“逢单舍四,逢双舍五”好不好?
Round(1.565,2)≈1.56
Round(1.565000000001,2)≈1.57
Round(1.575,2)≈1.58
即当保留位为双数时,若舍入值小于等于5,则舍去;当保留位为单数时,若舍入值小于5则舍去。
****************************************
这样说来,是不是round()函数就可以直接解决"四舍六入,五讨论----逢双舍去,逢单金一"的问题??????
------本问题,最后一次提问.
这样就不用再自己编写函数了-----若是这样太好了!
(如今科学计算都要求这样了!)
Top
20 楼yuechang8(恒昌)回复于 2005-08-06 21:50:26 得分 0
****************************************
这样说来,是不是round()函数就可以直接解决"四舍六入,五讨论----逢双舍去,逢单进一"的问题??????
------本问题,最后一次提问.
这样就不用再自己编写函数进行四舍六入-----若是这样太好!
(如今科学计算都要求这样了!)Top
21 楼unsigned(僵哥(发站内消息,请附上链接或问题说明,否则不予回复))回复于 2005-08-08 16:04:01 得分 10
这样说来,是不是round()函数就可以直接解决"四舍六入,五讨论----逢双舍去,逢单进一"的问题??????
------本问题,最后一次提问.
这样就不用再自己编写函数进行四舍六入-----若是这样太好!
(如今科学计算都要求这样了!)
============================
简单点回答:是的Top
22 楼yuechang8(恒昌)回复于 2005-08-12 20:37:45 得分 0
怎么结贴,怎么给分呢?老大Top
23 楼yuechang8(恒昌)回复于 2005-08-12 20:39:58 得分 0
(我就是小崔)Top




