2009-10-09 25 views
1

對不起,我只需要一套額外的眼睛,我第二次猜測自己。我正在從經典的vb6翻譯到C#,並且我已經在運算符優先級上查詢了表格,但是我仍然沒有正確地工作。我翻譯得對嗎?

VB6

= _ 
     m_curAmountInvested * (1 + m_dblInterestRate/12)^m_intMonthsToAttain + _ 
     m_curAddDeposits * ((1 + m_dblInterestRate/12)^m_intMonthsToAttain - 1)/(m_dblInterestRate/12) 

C#

= (currentAmountSaved * Math.Pow((1d + interestRate)/12d, numberOfMonths)) + 
        ((monthlySavingsAmount * (Math.Pow((1d + interestRate)/12d, numberOfMonths) - 1d))/(interestRate/12d)) 

回答

3

在我看來就像你可能在你的C#代碼這裏有一個問題:

Math.Pow((1d + interestRate)/12d, ...) 

你的VB6的代碼有:

(1 + m_dblInterestRate/12)^... 

VB6有*和/運營商帶來更高的優先級+和 - ,所以分區會在添加之前發生。但是,在C#版本中,由於括號的原因,這不是真的(即加法先到先,然後是除法)。

+0

ahhhh那會是問題!非常感謝,它是漫長的一天。 – Dave 2009-10-09 22:48:15

1

有兩個部分我不清楚在:

  • 指數運算符(^)的優先級。
  • VB6做了一些四捨五入自動

否則,它看起來不錯,假設你的變量名排隊。

你可能想實際上測試兩個版本有幾個值,並確保他們出來一樣。如果他們不同,檢查更好的舍入沒有使你的C#代碼實際上不是更多是正確的。

更新:
the docs快速檢查給^的最高 precendence。但是,這是VB.Net。我無法找到vb6的文檔,但StackOverflow agrees with it,所以我認爲你在那個部門也可以。

+0

我相信,指數優先於乘法,在所有語言中它都是中綴運算符。 – Noldorin 2009-10-09 21:32:34

+0

有關運算符優先級的部分似乎已從聯機MSDN VB6文檔中刪除。 – MarkJ 2009-10-10 20:23:06

0

VB中的第一個因子是m_curAmountInvested,在C#中它是currentAmountSaved。這可能是錯誤的。

+0

看起來OP通常在變量名中使用僞匈牙利符號編碼,所以我猜測它是故意的。 – jprete 2009-10-09 21:31:53

+2

我的意思是投資vs保存不匈牙利vs不是:) – alex 2009-10-09 21:33:04

1

1 + m_dblInterestRate/12!=(1D +的InterestRate)/ 12D

二進制和具有比低師procedence。我認爲你把它與一元+運算符(+5 == 5)相混淆,這個運算符的優先級高於除法。

+0

再次感謝,這是問題所在 – Dave 2009-10-09 22:50:53