我正在查看我的代码,每次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)
);
答案 0 :(得分:11)
Data.Volatility * Math.Pow(Data.ExpirationDays/365,.5)
自300/365起为0,因为int等于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);
}
答案 1 :(得分:3)
检查Data.ExpirationDays
的类型,如果类型为整数,Data.ExpirationDays/365
可能正在评估为0。这意味着分母将为零(零的平方根为零,零乘以Data.Volatility 仍然零),这将导致问题。
事实上,在你的情况下,分子结果也是零,因为log n 1总是为零,你将它加到零(另一个值乘以{{1} })。
您可能需要考虑在整个过程中使用浮点类型。
答案 2 :(得分:1)
Data.ExpirationDays/365
等于零。所以NaN非常期待。
答案 3 :(得分:0)
是不是因为您将Data.ExpirationDays错误拼写为Data.ExpriationDays所以Data.ExpirationDays默认为0?这将给出0/0,即NaN(分子是0 b / c,你碰巧有罢工=现货)
(我从来没有使用过C#,所以我不确定这只是你的帖子或你的代码中的错误(我希望编译器可以捕获它)。