Math ASP/VBScript中的十进制计算

Math ASP/VBScript中的十进制计算,math,vbscript,asp-classic,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无法存储在数据库中,因为它

这更多的是一个数学/逻辑问题,所以如果这不是问这个问题的合适地方,我道歉,我已经为此工作了几个小时,似乎找不到正确的解决方案。我在数据库中有一个字段,我用它来存储棒球投球局,它存储小数点后一位的小数。小数位数只能以.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*总计)/3


但在某些情况下,这仍然不能满足我的需求。任何指导都将不胜感激。

这可能会有所改进,但似乎还可以:

有两个功能

Tothird将一局数(如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
%>
=7那么
变量宁=变量宁和“.0”
ElseIf VAR剩余值<4则
变量宁=变量宁和“.1”
ElseIf VarRequires<7那么
变量宁=变量宁和“.2”
如果结束
Toennings=变量
端函数
%>

将局数视为单独的对象,而不是具有不同类型加法的十进制数。创建对象一开始要做更多的工作,但当您更频繁地使用该对象时,它们的优势就没有了:

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
你说的是“小数”,但这些并不像任何数学家(或VBScript)理解的那样是小数。也许您可以尝试使用Cstr()将数字转换为字符串,然后使用replace函数将.1替换为.33,将.2替换为.66。然后可以使用Ccur()将其转换回十进制值并进行加法。然后需要类似的逻辑将总数的小数位转换回.1或.2,以及将.99四舍五入为整数的方法。我认为编写代码并不困难,只是非常乏味。