2014-01-16 50 views
0

這是一個數學/邏輯問題,所以我很抱歉如果這不是問這個問題的適當位置,我剛剛在這工作了幾個小時,似乎無法找到正確的解決方案。我在數據庫中有一個字段,用於存儲棒球局投球,其中存儲有一位小數的十進制數字。小數位只能以.0,.1或.2結尾。對於那些不熟悉棒球統計的人來說,投球通常存儲爲50.1,這意味着投手投了50個滿局和另一個局的1/3。 50.2將是50局和另一局的2/3。ASP/VBScript中的十進制計算

因此,舉例來說,這些數字可以被存儲在數據庫中: 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

請您談一下「小數」,但這些都不是小數任何數學家(或VBScript)會明白這個概念。也許你可以嘗試使用Cstr()將你的數字轉換爲字符串,然後使用替換函數用.33和.2替換.1和.66。然後,您可以使用Ccur()將其轉換回十進制值並添加。然後,您需要類似的邏輯將總量的小數位轉換回.1或.2,也可以將.99整數轉換爲整數。我認爲編寫代碼並不困難,只是非常單調乏味。 – John

回答

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

查看局部作爲單獨的對象,而不是用不同類型的加法的十進制數。創建對象在第一有點更多的工作,但是當你使用更頻繁的對象清退自己的優勢:

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