2009-10-09 26 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