2013-03-15 90 views
1

我有以下代码:不能围捕了一些

Dim a as Long 
a = InputBox("a=") 
Dim nr_cifre as Long 
nr_cifre = 0 
Dim n as Long 
n=a 
Do While n <> 0 
    n=n/10 
    nr_cifre = nr_cifre + 1 
Loop 
If a - a mod (10 * nr_cifre) = 0.5 Then 
    a=a+0.9+(nr_cifre*10) 
End If 
MsgBox a mod (10 * nr_cifre) 

基本上,它试图围捕号码。因此,2.3将变为2.另外,它试图收集,例如2.5到3.

该示例适用于小数字,如1234,5。但如果我试图收集12345,6,它会给我一些奇怪的错误。我也尝试过VB6中的代码,但没有成功。

我可以问你的帮助/建议吗?任何提示高度赞赏。提前致谢!

+0

你有什么反对Round - 'round(2.6,0)'?无可否认,它让银行家四舍五入,但这似乎是你想要的。另见http://blogs.msdn.com/b/ericlippert/archive/2003/09/26/bankers-rounding.aspx – Fionnuala 2013-03-15 22:52:56

+2

“给我一些奇怪的错误”对任何人都没有意义,除了你,因为我们看不到你的屏幕或阅读你的想法。如果您遇到错误,请提供您正在收到的确切错误**或您遇到的问题,包括您收到的任何错误消息。 (你可以使用'Round'(或'Ceiling',如果你总想收起来;它可能是VBScript中的Ceil'--我不记得了),其中任何一种都比试图写自己的更好。) – 2013-03-15 22:53:24

+0

@Remou这次我必须自己制定一个算法,所以我不能使用编程语言的嵌入式函数。 – 2013-03-15 22:57:34

回答

3

如果你需要那么你自己的算法试试这个:

WSH.Echo CustomRound(-123456.7) '-123457 
WSH.Echo CustomRound(-123456.5) '-123456 
WSH.Echo CustomRound(-123456.3) '-123456 
WSH.Echo CustomRound(123456.7) '123457 
WSH.Echo CustomRound(123456.5) '123457 
WSH.Echo CustomRound(123456.3) '123456 

Function CustomRound(nValue) 
    CustomRound = Int(nValue + 0.5) 
End Function 

或...

WSH.Echo CustomRound2(-123456.7) '-123457 
WSH.Echo CustomRound2(-123456.5) '-123457 
WSH.Echo CustomRound2(-123456.3) '-123456 
WSH.Echo CustomRound2(123456.7) '123457 
WSH.Echo CustomRound2(123456.5) '123457 
WSH.Echo CustomRound2(123456.3) '123456 

Function CustomRound2(nValue) 
    CustomRound2 = Sgn(nValue) * Int(Abs(nValue) + 0.5) 
End Function 

嗯......多一个想法:)

Function RoundFrm(nValue) 
    RoundFrm = Null 
    If IsEmpty(nValue) Or _ 
    Not IsNumeric(nValue) Then Exit Function 
    RoundFrm = FormatNumber(nValue, 0) 
End Function 

而且使用以上的想法可以使功能更完整...

Function RoundEx(nValue) 
    Select Case VarType(nValue) 
     Case vbInteger, vbLong 
      RoundEx = nValue 
     Case vbSingle 
      RoundEx = CSng(FormatNumber(nValue, 0)) 
     Case vbDouble 
      RoundEx = CDbl(FormatNumber(nValue, 0)) 
     Case vbCurrency 
      RoundEx = CCur(FormatNumber(nValue, 0)) 
     Case Else: RoundEx = Null 
    End Select 
End Function 
+0

我在上面的代码中尝试过类似的东西,但是我没有使用Int函数,而是使用了相同的结果。事实上,我认为错误是由数字计数循环产生的... – 2013-03-15 23:24:26

+0

我用一个更多的功能更新我的答案。我将这两个概念都用在没有内置Round函数的语言中(只有Ceil/Floor),我认为它已被证明。 – 2013-03-15 23:39:00