2009-11-16 31 views
1

我有以下的Visual C++代码使用数学::圆形

#include <iostream> 
#include <string> 
#include <sstream> 
#include <math.h> 

using namespace std; 

int Main() 
{ 
    double investment = 0.0; 
    double newAmount = 0.0; 
    double interest = 0.0; 
    double totalSavings = 0.0; 
    int month = 1; 
    double interestRate = 0.065; 

    cout << "Month\tInvestment\tNew Amount\tInterest\tTotal Savings"; 
    while (month < 10) 
    { 
      investment = investment + 50.0; 
     if ((month % 3 == 0)) 
     { 
      interest = Math::Round((investment * Math::Round(interestRate/4, 2)), 2); 
     } 
     else 
     { 
      interest = 0; 
     } 
     newAmount = investment + interest; 
     totalSavings = newAmount; 
     cout << month << "\t" << investment << "\t\t" << newAmount << "\t\t" << interest << "\t\t" << totalSavings; 
     month++; 
    } 
    string mystr = 0; 
    getline (cin,mystr); 
    return 0; 
} 

但它给我使用数学::圆形的问题,我实在不知道该如何使用Visual C++

回答

6

不幸的是,Math :: Round是.NET框架的一部分,不是普通C++规范的一部分。有两种可能的解决方案。

第一个是自己实现圆形函数,使用<cmath>的ceil或floor并创建类似于以下的函数。

#include <cmath> 
inline double round(double x) { return (floor(x + 0.5)); }

二是使你的C++程序通用语言运行时(CLR)的支持,这将允许访问.NET框架,但其成本也不再是一个真正的C++程序。如果这只是你自己使用的一个小程序,这可能不是什么大问题。

要启用CLR支持,请执行以下操作:

右键点击你的解决方案,然后单击属性。然后点击配置属性 - >常规 - >项目默认值。在Common Language Runtime支持下,选择Common Language Runtime Support(/ clr)选项。然后点击应用并确定。

接下来,添加以下代码的顶部:

using namespace System;

现在你应该可以使用数学::圆形与任何其他.NET语言。

+0

你的版本有两个问题,有值时添加'.5'将不起作用,截断为'int'有溢出问题。我在[我的答案]中解释了这两个问题(http://stackoverflow.com/a/24348037/1708801)。 Boost是旧系统的一个可行的替代方案。 – 2014-07-03 02:29:25

+1

@ShafikYaghmour很好的捕捉类型问题。至于算法本身,这是一个超出这个问题范围的巨大讨论方式。我会说算法非常普遍,应该足以满足这里所表达的需求。 – Swiss 2014-07-03 19:20:02

+0

它包括'0.49999999999999994',[看到它](http://coliru.stacked-crooked.com/a/e8c613b87fc742ca) – 2014-07-04 01:29:51

7

Math :: Round()是.NET,而不是C++。

我不相信在C++中有直接的平等。

您可以编写自己的像这样(未经):

double round(double value, int digits) 
{ 
    return floor(value * pow(10, digits) + 0.5)/pow(10, digits); 
} 
+0

某些值失败据我可以告诉这是行不通的,一般地滚动自己的[round很难做到正确]的版本(http://stackoverflow.com/a/24348037/1708801)。 – 2014-07-03 02:48:34

0

你可能会更好添加0.5和使用地板()在这里的另一个帖子中提到的获得基本的四舍五入。

3

恰好碰到了这一点,现在是2013年

这是在C11,不是旧版本的支持。所以是的,批准的答案在09年是适当的。

如果您正在使用C11和你做

include <math.h> 

,你应该能够调用 “圆圆”,

这样的:

double a = 1.5; 
    round(a); 

,导致:

a == 1.0 
+0

只是评论说,编辑纯粹是为了清晰并纠正一些格式。 – Scott 2014-04-02 20:02:30

+1

如果您使用的是VC12或更高版本的编译器,仍然可以使用。 (Visual Studio 2013或更新版本) – 2014-06-12 00:35:30