我在VB中,想用一个函数能保留小数点二位,但用round的四舍五入,不能保留小数位,请问各位用什么函数。
解决方案 »
- vb+access数据库的插入
- 如何使图片变灰?
- 怎样才能让VB在打开一个窗口时自动关闭前一个窗口?求高手
- 用代码建access的一个表,字段有70多个,提示"记录过大"而出现错误,可能是文本属性的总字段太大了吧,如何解决?
- 新手问一个非常菜的问题,帮帮我吧...在线等待
- 帮帮我这个初学者
- 请教:用VB在Word中创建一个表格后,如何控制其格式?
- vb如何连接access数据库?
- [统计]大家VB6编程都碰到过什么错误?
- 捕获别的程序中的键盘输入键码?
- 用activereport做报表,多个数据源如何处理呀?我用ado记录集做数据源.一个我会,关键是多个数据源.
- 删除指定目录及当前目录下的所有东西要怎么做呢?
vb自带的ROUND经常出现不能正确四舍五入的问题,把它扔到垃圾站中吧.我平时用开的自定义函数如下:
'自定义保留小数点位数函数
'参数i表示待操作之数值
'参数j表示保留小数点位数
Public Function MyRound(i As Double, j As Integer) As Double
On Error Resume NextDim s As String
Dim k As Integers = "#."
For k = 1 To j
s = s & "#"
NextMyRound = Format(i, s)End Function
dim n as long
d = 3.445
n = 2 '保留2位
msgbox cdbl(clng(d*10^n))/cdbl(d*10^2) 'msgbox format(cdbl(clng(d*10^2))/cdbl(d*10^2),"#.00")
x=round(x,2)
这个比较的强
x=round(x,2)
这个比较的强
_____________________此法不可取。如:
Dim x As Doublex = 2.335243542352
x = Round(x, 2)debug.print x
这时你再看看X等于多少?2.34!
再一次建议楼主:坚决丢掉round.
我与是主张format,但有网友反映format在XP下无反应,打了补丁也不行.不知有谁在XP下试过?
比如
round(2.3456,2)
输出结果就为:2.35
昨晚查阅了一下资料,觉得做个小结了:
一、关于Round函数
VB6中文版说这个函数是四舍五入函数,实际上这个函数采用的四舍六入五留双。
VB的Round所采用的算法是这样的:
1.25留一位,则1.2=round(1.25)
如果是1.35,则1.4=round(1.35)
奇进偶不进。这样在一大串需要四舍五入的数相加相减相乘时误差小一点。
eg:1.25+1.35+1.45+1.55+1.15+1.65=8.4=round(1.25)+round(1.35)+round(……
ROUND函数符合国家和国际标准,该函数是正确的。原先的四舍五入只是一个简化。
在微软的Knowledge Base的文章:“Q194983 PRB: Round Function Different in VBA 6 and Excel Spreadsheet”和微软的Knowledge Base的文章:“Q189847 INFO: New String and Format Functions in Visual Basic 6.0”中都指出Round函数实行Banker舍入,而不是我们习惯的算术舍入(四舍五入)。
可以参考微软的Knowledge Base的文章:“Q196652 HOWTO: Implement Custom Rounding Procedures”,它对于舍入问题有详细的讨论。 二、解决方法
1、自定义函数
'自定义保留小数点位数函数
'参数i表示待操作之数值
'参数j表示保留小数点位数
Public Function MyRound(i As Double, j As Integer) As Double
On Error Resume NextDim s As String
Dim k As Integers = "#."
For k = 1 To j
s = s & "#"
NextMyRound = Format(i, s)End Function
2、INT函数
INT(I+0.5)。INT函数是相当于舍弃小数位的函数,将浮点数在数轴上向左找最近的整数,FIX函数是向0点找最近的整数,综上所述,使用INT函数将原有的数字进行+0.5然后取整,在C中强制类型转换取整实现四舍五入是同样的原理。
3、其他网友的几个自定义函数
(1)
Function RoundEx(Number, Optional nLen As Long = 0)
On Error GoTo ErrRound
Dim dblAdd As Double
dblAdd = 10 ^ (-nLen - 1)
If Number < 0 Then dblAdd = -dblAdd
Number = Number + dblAdd
RoundEx = Round(Number, nLen)
Exit Function
ErrRound:
MsgBox "实时错误:" & Err.Number & vbCrLf & vbCrLf & Err.Description, vbExclamation, "错误提示"
End Function
(2)
Function Round (X as Double, DP as integer) as Double
X = X*10 ^ DP + 0.5
Round = Int( X ) / 10 ^ DP
End Function
(3)
Public Function Round45(n As Double, p As Integer) As Double
Dim s As String, a As String, b As String, x As String, v As Double
If n = 0 Or p < 0 Then Round45 = "": Exit Function
s = Trim(Str(n))
If InStr(s, ".") <> 0 Then
a = Mid(s, 1, InStr(s, ".") - 1)
b = Mid(s, InStr(s, ".") + 1)
Else
a = s
b = ""
End If
If Len(b) <= p Then
Round45 = CDbl(Val(a + "." + b))
Exit Function
Else
If Val(Mid(b, p + 1, 1)) >= 5 Then
x = a + Mid(b, 1, p)
v = CDbl(Val(x))
v = v + 1#
v = v / (10 ^ p)
Round45 = v
Exit Function
Else
Round45 = CDbl(Val(a + "." + b))
Exit Function
End If
End If
End Function
(4)
Public Function Round(ByVal dblNumber As Double, Optional ByVal intFactor As Integer = 0) As Double
Round = Fix(CDbl(dblNumber * 10 ^ intFactor + 0.5 * Sgn(dblNumber))) / 10 ^ intFactor
End Function4、注意问题:
注意:在XP系统下有以下BUG:
fix(12.565*100+0.5)=1256
fix(cdbl(12.565*100+0.5))=1257
所以必须使用CDbl转换。
*******************************************************除了第一个函数是俺的之外,其他资料参考了李海鹰等网友的文章,一并致谢!