首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我会得到NaN?

为什么我会得到NaN?
EN

Stack Overflow用户
提问于 2010-07-30 23:49:02
回答 3查看 1K关注 0票数 4

我正在检查我的代码,每次D1最终都是NaN。代码在我看来没问题,我完全被难住了……

代码语言:javascript
运行
复制
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)
    );
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-07-30 23:52:34

由于300/365整数等于0,因此Data.Volatility * Math.Pow(Data.ExpirationDays/365,.5)为0

假设ExpriationDays属性确实是int类型,它将使整个表达式为0。

例如:

代码语言:javascript
运行
复制
[Test]
public void Test()
{
    var val = 300 / 365;

    Assert.That(val, Is.EqualTo(0));
}

关于除以0的一些评论:

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

代码语言:javascript
运行
复制
[Test]
public void TestIntDiv()
{
    int zero = 0;
    int val;

    Assert.Throws<DivideByZeroException>(() => val = 0 / zero);
}

当除以两个0双精度时,结果将是NaN,并且不会抛出异常:

代码语言:javascript
运行
复制
[Test]
public void TestDoubleDiv()
{
    double zero = 0;
    double val = 0 / zero;

    Assert.That(val, Is.NaN);
}
票数 11
EN

Stack Overflow用户

发布于 2010-07-30 23:53:57

  • Data.ExpirationDays/365等于零。
  • 0^ 0.5等于零too.
  • Data.Volatility *0=0。
  • D1=
  • /0。

因此,NaN是非常值得期待的。

票数 1
EN

Stack Overflow用户

发布于 2010-07-30 23:54:12

是不是因为您将Data.ExpirationDays错误地拼写为Data.ExpriationDays,所以Data.ExpirationDays缺省为0?这将得到0/0即NaN (分子是0 b/c,您碰巧有strike=spot)

(我从来没有使用过C#,所以我不确定这只是你的文章中的一个错误,还是你的代码中的一个错误(我本以为编译器会捕捉到的))

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3373145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档