这更像是一个数学/逻辑问题所以我很抱歉,如果这不是提出这个问题的正确位置,我刚刚在这个问题上工作了好几个小时,似乎找不到合适的解决方案。我在数据库中有一个字段,我用它来存储棒球局,它存储十进制数字和一个小数位。小数位只能以.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
但在某些情况下,这仍然没有给我我正在寻找的东西。任何指导都将不胜感激。
答案 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