我正在检查我的代码,每次D1最终都是NaN。代码在我看来没问题,我完全被难住了……
double D1;
Data Data = new Data();
PriceSpot = 40;
Data.PriceStrike = 40;
Data.RateInterest = .03;
Data.Volatility = .3;
Data.ExpriationDays = 300;
D1 =
(
Math.Log(PriceSpot/Data.PriceStrike) +
(
(Data.RateInterest + (Math.Pow(Data.Volatility,2)/2)) *
(Data.ExpirationDays/365)
)
) /
(
Data.Volatility *
Math.Pow(Data.ExpirationDays/365,.5)
);
发布于 2010-07-30 23:52:34
由于300/365整数等于0,因此Data.Volatility * Math.Pow(Data.ExpirationDays/365,.5)
为0
假设ExpriationDays
属性确实是int
类型,它将使整个表达式为0。
例如:
[Test]
public void Test()
{
var val = 300 / 365;
Assert.That(val, Is.EqualTo(0));
}
关于除以0的一些评论:
当除以两个0整数时,将在运行时抛出异常:
[Test]
public void TestIntDiv()
{
int zero = 0;
int val;
Assert.Throws<DivideByZeroException>(() => val = 0 / zero);
}
当除以两个0双精度时,结果将是NaN,并且不会抛出异常:
[Test]
public void TestDoubleDiv()
{
double zero = 0;
double val = 0 / zero;
Assert.That(val, Is.NaN);
}
发布于 2010-07-30 23:53:57
Data.ExpirationDays/365
等于零。因此,NaN是非常值得期待的。
发布于 2010-07-30 23:54:12
是不是因为您将Data.ExpirationDays错误地拼写为Data.ExpriationDays,所以Data.ExpirationDays缺省为0?这将得到0/0即NaN (分子是0 b/c,您碰巧有strike=spot)
(我从来没有使用过C#,所以我不确定这只是你的文章中的一个错误,还是你的代码中的一个错误(我本以为编译器会捕捉到的))
https://stackoverflow.com/questions/3373145
复制相似问题