2009-11-16 70 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