为什么我会得到NaN?

soo*_*ise 4 c#

我正在查看我的代码,每次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)
    );
Run Code Online (Sandbox Code Playgroud)

Eli*_*sha 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));
}
Run Code Online (Sandbox Code Playgroud)

关于除以0的一些评论:

除以两个0整数时,将在运行时抛出异常:

[Test]
public void TestIntDiv()
{
    int zero = 0;
    int val;

    Assert.Throws<DivideByZeroException>(() => val = 0 / zero);
}
Run Code Online (Sandbox Code Playgroud)

除以两个0的两倍后,结果将是NaN,并且不会抛出任何异常:

[Test]
public void TestDoubleDiv()
{
    double zero = 0;
    double val = 0 / zero;

    Assert.That(val, Is.NaN);
}
Run Code Online (Sandbox Code Playgroud)

  • 如果需要,可以将它保持为int,但请注意int/int是一个整数除法,但是int/double是一个浮点除法,所以你可以在365上使用.0使它按你想要的方式工作,即.`Data.ExpirationDays/365.0` (3认同)