ASP / VBScript中的十进制计算

时间:2014-01-16 21:17:00

标签: math vbscript asp-classic

这更像是一个数学/逻辑问题所以我很抱歉,如果这不是提出这个问题的正确位置,我刚刚在这个问题上工作了好几个小时,似乎找不到合适的解决方案。我在数据库中有一个字段,我用它来存储棒球局,它存储十进制数字和一个小数位。小数位只能以.0,.1或.2结尾。对于那些不熟悉棒球统计数据的人来说,投球通常会存储为50.1,这意味着一个投手投了50个完整的局和1/3的另一局。 50.2将是50局,另一局是2/3。

例如,这些数字可以存储在数据库中: 10.1 26.2 13.2 7.1

28.5无法存储在数据库中,因为它以.5结尾,并且只能以.0,.1或.2结尾。

我的问题是,在我的网页上,我正在尝试添加这些数字以获得总投票数,但总数不正确。

在我上面的例子中,技术上最多可加起来为56.6,最多应加起来为58.0。

另一个例子是如果我添加数字28.1,61.2和69.1。当我需要将它添加到159.1时,这总计增加到158.4。

我在网上发现的例子是: (3 * totalInnings)/ 3

但在某些情况下,这仍然没有给我我正在寻找的东西。任何指导都将不胜感激。

2 个答案:

答案 0 :(得分:1)

这可能会有所改善,但似乎工作正常:

有两个功能。

ToThirds将局数量(例如10.1)转换为更有用的三分之一(10.1中有31个三分位数)。

ToInnings将三分之一的金额转换回局数。

第一行(Response.Write ...)是您的示例,它返回与您计算的结果相同的结果。

<%
Response.Write "<p>" & ToInnings(ToThirds(10.1) + ToThirds(26.2) + ToThirds(13.2) + ToThirds(7.1))

Response.Write "<p>" & ToInnings(ToThirds(28.1) + ToThirds(61.2) + ToThirds(69.1))

Function ToThirds(varInnings)
    Dim varNumber, varRemainder
    varNumber = Int(varInnings)
    varRemainder = varInnings - varNumber

    varNumber = (varNumber * 3) + (varRemainder * 10)

    ToThirds = varNumber
End Function

Function ToInnings(varNumber)
    Dim varInnings, varRemainder

    varInnings = varNumber / 3
    varRemainder = varInnings - Int(varInnings)
    varInnings = Int(varInnings)

    If varRemainder = 0 Or varRemainder >=7 Then
        varInnings = varInnings & ".0"
    ElseIf varRemainder < 4 Then
        varInnings = varInnings & ".1"
    ElseIf varRemainder < 7 Then
        varInnings = varInnings & ".2"
    End If

    ToInnings = varInnings
End Function
%>

答案 1 :(得分:1)

将局视为单独的对象,而不是具有不同类型的添加的十进制数。创建对象起初工作起来要多一些,但是当你更频繁地使用这个对象时,它们就会失去优势:

Option Explicit

' Constructor function that accept a score as string
Public function new_inning(score)
    dim fullScore, partScore
    fullScore = split(score, ".")(0)
    If instr(score, ".") > 0 then
        partScore = split(score, ".")(1)
    else
        partScore = 0
    End if
    Set new_inning = (new Inning).Init(fullScore, partScore)
End function

class Inning

    private fullScore_, partScore_

    Public Property Get FullScore()
        FullScore = fullScore_
    End Property

    Public Property Get PartScore()
        PartScore = partScore_
    End Property

     ' Todo: insert some checking of valid scores
    Public function Init(fScore, pScore)
        fullScore_ = cInt(fScore)
        partScore_ = cInt(pScore)
        Set init = me
    End Function

     ' Please note, this returns a new inning object so it keeps this object
     ' away from manipulation
    Public Function Add(addInning)
        Dim fScore, pScore

        fScore = FullScore + addInning.FullScore
        pScore = PartScore + addInning.PartScore
        if pScore > 2 then
            pScore = pScore - 3
            fScore = fScore + 1
        end if
        Set Add = (new Inning).Init(fScore, pScore)
    end Function

    Public Function ToString()
        ToString = cStr(fullScore) & "." & cStr(partScore)
    End Function

end class

Dim myInning1, myInning2, resultInning
Set myInning1 = new_Inning("10.1")
Set myInning2 = new_Inning("15.1")

' Adding two innings
Set resultInning = myInning1.Add(myInning2)
Wscript.Echo resultInning.ToString() ' -> 25.2

' Inlining the adding of two innings
wscript.Echo resultInning.Add(new_inning("12.1")).ToString() ' -> 38.0
wscript.Echo resultInning.Add(new_inning("20.2")).ToString() ' -> 46.1