此等式仅在传递某些值时返回 NaN

Posted

技术标签:

【中文标题】此等式仅在传递某些值时返回 NaN【英文标题】:This equation returns NaN only when certain values are passed 【发布时间】:2015-12-23 00:06:13 【问题描述】:

因此,对于我的 C# 编程课程,我必须根据余额、每月付款和 APR 计算还清信用卡余额所需的月数。

这是我们被赋予解释的公式:

这是我制作的 C# 版本:

months = (double)decimal.Divide(-1, 30) * (
  Math.Log(1 + (double)(balance / payment) * (1 - Math.Pow((1 + (apr / 365)), 30)))
    / Math.Log(1 + (apr / 365))
);

它适用于我尝试过的每个示例,除了一个在我需要回答的问题中指定的示例:

Alice 需要多少个月才能还清 7,500.00 美元的余额,如果 APR 值为 0.22,她每月支付 125.00 美元?

其输出如下所示:

Enter the credit card balance (example: 10000.00)
7500
Enter the monthly payment amount (example: 250.00)
125
Enter the annual percentage rate (example: 0.15)
0.22
It will take NaN months to pay off the balance.
Goodbye! Press any key to exit.

在我的调查中,我将公式插入到 WolframAlpha 中,它返回两个不同的值 (http://bit.ly/1LQSsEx) 也许这与它有关,但我是 C# 新手并且已经达到了我的知识的尽头。

这里发生了什么,我该如何解决?

【问题讨论】:

那行 c# 不是很可读。我会打破它。它将帮助您调试。 Code should be written for humans to read first and computers to read second 我猜如果 wolfram 给你一个复数作为结果,这意味着你的方程没有真正的解决方案可能 log 超出了它的域,或者类似的东西...所以这就是NaN的原因 考虑将您的等式更改为表达式,例如:Expression<Func<double, double, double, double>> months = (b, p, i) => (-1 / 30d) * ( Math.Log(1 + (b / p) * (1 - Math.Pow(1 + i, 30))) / Math.Log(1 + i) ); 【参考方案1】:

以下代码的结果产生一个负数。

1 + (double)(7500 / 125) * (1 - Math.Pow((1 + (0.22 / 365)), 30))

Math.Log 显然只适用于数字 > 0

这就是给你NaN的原因。

【讨论】:

啊!谢谢你。我将它包装在 Math.Abs​​ 中,现在我得到了我应该得到的输出。希望这不是一个糟糕的解决方案!我也应该用 Abs 包装另一个 Math.Log 函数吗?编辑:其实没关系,不明白为什么我需要,因为输入在任何情况下都不应该小于零。

以上是关于此等式仅在传递某些值时返回 NaN的主要内容,如果未能解决你的问题,请参考以下文章

数组中的字符串仅在尝试获取单个值时返回未定义?

浅谈NaN和undefined--------与君共勉

为啥 NaN = !NaN 返回真?

acos(1) 在某些情况下返回 NAN

为啥一个变量对多个值的不等式检查总是返回真?

为啥一个变量对多个值的不等式检查总是返回真?