此等式仅在传递某些值时返回 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的主要内容,如果未能解决你的问题,请参考以下文章