我正在Objective-C
中实现数学计算,其中我使用了pow(<#double#>, <#double#>)
函数,但它表现得很奇怪。
我正在尝试解决下面的数学
100 *(0.0548/360*3+powf(1+0.0533, 3/12)/powf(1+0.0548, 3/12))
对于相同的数学,excel和xcode的结果是不同的。
Excel output = 100.01001 (correct)
NSLog(@"-->%f",100 *(0.0548/360*3+powf(1+0.0533, 3/12)/powf(1+0.0548, 3/12)));
Xcode output = 100.045667 (wrong)
现在大家都知道 3/12 = 0.25
当我替换 * 3/12
*与上面的数学中的 0.25
时,xcode会返回如下所示的真实结果
Excel output = 100.01001 (correct)
NSLog(@"-->%f",100 *(0.0548/360*3+powf(1+0.0533, 0.25)/powf(1+0.0548, 0.25)));
Xcode output = 100.010095 (correct)
任何人都知道为什么pow
函数表现得像这样奇怪?
注意:我还使用了powf
,但行为仍然相同。
答案 0 :(得分:10)
3/12
为零。在C,C ++,ObjC和Java等语言中,只包含整数的x / y
这样的表达式为您提供了一个整数结果,而不是一个浮点结果。
我建议您尝试使用3.0/12.0
。
以下C程序(在这种情况下与ObjC相同的行为)显示了这一点:
#include <stdio.h>
#include <math.h>
int main (void) {
// Integer math.
double d = 100 *(0.0548/360*3+powf(1+0.0533, 3/12)/powf(1+0.0548, 3/12));
printf ("%lf\n", d);
// Just using zero as the power.
d = 100 *(0.0548/360*3+powf(1+0.0533, 0)/powf(1+0.0548, 0));
printf ("%lf\n", d);
// Using a floating point power.
d = 100 *(0.0548/360*3+powf(1+0.0533, 3.0/12.0)/powf(1+0.0548, 3.0/12.0));
printf ("%lf\n", d);
return 0;
}
输出是(注释):
100.045667 <= integer math gives wrong answer.
100.045667 <= the same as if you simply used 0 as the power.
100.010095 <= however, floating point power is okay.