因此,從本質上講,我正在閱讀一本C 書籍,其中一個練習是修改書中的一個例子,以使用銀行家的四舍五入。就背景關系而言,銀行家的四舍五入是指在小數點上,你要四舍五入到最接近的偶數整數。我已經嘗試了幾個小時,想知道如何實作它,但沒有任何方法可以幫助我。書中的代碼列在下面。
// Ex. 5.31: DollarAmount.h
// DollarAmount類得到兩個引數的建構式。
#include <string>
#include <cmath>
class DollarAmount {
public:
//從一個int64_t值初始化金額。
explicit DollarAmount(int64_t dollars, int64_t cents) /span> 。amount{美元 * 100 cents}。{ }
//將右邊的金額添加到這個物件的金額中。
void add(DollarAmount right) {
amount = right.amount。
}
//從這個物件的金額中減去right的金額。
void subtract(DollarAmount right) {
//可以訪問同一類其他物件的私有資料。
amount -= right.amount。
}
//用除數除以金額。
void divide(int divisor) {
amount = (amount divisor / 2) / divisor;
}
//使用整數算術來計算利息金額,//使用整數算術來計算利息金額。
//然后用利息金額呼叫add。
void addInterest(int rate, int divisor) {
//span>創建代表利息的DollarAmount。
DollarAmount interest {
((金額*利率 除數/2)/除數) / 100, //美元.
((金額*匯率 除數/2) /除數) % 100 // cents
};
add(interest); //將利息加入此物件的金額。
}
//回傳一個DollarAmount物件的字串表示。
std::string toString() const{
std::string dollars{std::to_string(an amount / 100)}。
std::string cents{std::to_string(std::abs( amount % 100))}。
return dollars "." (cents.size() == 1 ? "0"/span> : ""/span>) 分數。
}
private:
int64_t amount{0}; // dollar amount in pennies.
};
我已經嘗試了幾種方法,但由于其他方法不起作用,我又將代碼恢復到了原來的形式。目前的演算法使用正常的四舍五入。作者并沒有很好地解釋四舍五入系統。
編輯:這里有一個四舍五入系統。
編輯:這里也是使用的主程式。
// Ex. 5.31: Interest.cpp
/// 使用DollarAmount類和整數進行復利計算。
#include <iostream>
#include <ioomanip>
#include <string>
#include "DollarAmount.h"
int main() {
DollarAmount d1{123, 45}; // $123.45
DollarAmount d2{15, 76}; // $15.76。
cout << "在將d2(" << d2.toString() << " )加入d1("
<< d1.toString() << "),d1 = ";
d1.add(d2); //修改物件d1。
cout << d1.toString() < < "
"。
cout << "在將d2(" << d2.toString() << ")減到d1("
<< d1.toString() << "),d1 = ";
d1.subtract(d2); //修改物件d1。
cout << d1.toString() < < "
"。
cout << "從d1(" << d2.toString() << ")減去d2("
<< d2.toString() << "),d2 = ";
d2.subtract(d1); //修改物件d2。
cout << d2.toString() < < "
"。
cout << "在將d1(" << d1.toString() << ")除以2,d1="。
d1.divide(2); //修改物件d1。
cout << d1.toString() < < "
"。
cout << "輸入整數的利率和除數。比如說。
"/span>
<< "對于2%,輸入:2 100
"
<< "對于2.3%,輸入:23 1000
"/span>
<< "對于2.37%,輸入:237 10000
"/span>
<< "對于2.375%,輸入:2375 100000
"。
int rate; // whole-number interest rate。
int divisor; //rate的除數。
cingt;> rate >> divisor;
DollarAmount balance{1000, 0}; //初始本金數額為便士。
cout << "
初始余額。" << balance.toString() << endl;
// display headers
cout << "
年份" << setw(20) << "存款金額" << endl;
//計算十年中每一年的存款金額。
for (unsigned int year{1}; year <=10; year ) {
//增加余額的比率%(即,比率/除數)。
balance.addInterest(rate, divisor)。
//顯示年份和金額。
cout << setw(4) << year << setw(20) < < balance。 toString() << endl;
}
我目前正在用輸入2 100和5 1000000進行測驗。
我試著在運算式mod 1是0.5的情況下做一個條件,如果是真的,就使用正常的美分,如果運算式mod 2是偶數,就使用正常的美分加0,如果運算式mod 2是奇數,就使用1。結果這很混亂,甚至沒有作業,而且在我測驗的時候,不知為什么把所有的美分都弄掉了。對于銀行家的四舍五入演算法,輸入2 100應該回傳1218.98的10年,而5 1000000應該總是回傳1000,因為它是四舍五入到最接近的偶數整數,向下取整。
編輯2:我對代碼進行了一些修改,我想我已經想到了我要使用的演算法。下面是修改后的源代碼。
// Ex. 5.31: DollarAmount.h
// DollarAmount類得到兩個引數的建構式。
#include <string>/span>
#include <iostream>
#include <cmath>
class DollarAmount {
public:
//從一個int64_t值初始化金額。
explicit DollarAmount(int64_t dollars, int64_t cents) /span> 。amount{美元 * 100 cents}。{ }
//將右邊的金額添加到這個物件的金額中。
void add(DollarAmount right) {
amount = right.amount。
}
//從這個物件的金額中減去right的金額。
void subtract(DollarAmount right) {
//可以訪問同一類其他物件的私有資料。
amount -= right.amount。
}
//用除數除以金額。
void divide(int divisor) {
amount = (amount divisor / 2) / divisor;
}
//使用整數算術來計算利息金額,//使用整數算術來計算利息金額。
//然后用利息金額呼叫add。
void addInterest(int rate, int divisor) {
//span>創建代表利息的DollarAmount。
DollarAmount interest {
((金額*利率 除數/2)/除數) / 100, //美元.
((金額*匯率 除數/2) /除數) % 100 // cents
};
if (static_cast<int64_t> ((((amount * rate divisor / 2) / divisor) % 1) * 10) == 5) {
if (interest.amount % 2 == 1) {
利息.金額--。
}
std::cout << "test";
}
add(interest); //add interest to this object's amount。
}
//回傳一個DollarAmount物件的字串表示。
std::string toString() const{
std::string dollars{std::to_string(an amount / 100)}。
std::string cents{std::to_string(std::abs( amount % 100))}。
return dollars "." (cents.size() == 1 ? "0"/span> : ""/span>) 分數。
}
private:
int64_t amount{0}; // dollar amount in pennies.
};
因此,從本質上講,我的計劃只是正常地創建利息物件,但隨后我檢查是否滿足銀行家的四舍五入條件,然后如果interest.amount變數% 2 == 1,意味著它沒有四舍五入到最接近的偶數整數。如果這個條件被滿足,它就會減少利息.金額變數的數量。這似乎有點亂,但由于似乎沒有更簡單的方法,我想我將嘗試這種方法。問題是 if 陳述句目前還不能檢查是否需要銀行家的四舍五入。
編輯3:添加評論
// Ex. 5.31: DollarAmount.h
// DollarAmount類得到兩個引數的建構式。
編輯4:好的,所以我已經想好了,我將使用正常的四舍五入,然后檢查是否需要銀行家的四舍五入,然后如果它是,并且interest.amount是奇數,意味著它偏離了銀行家的四舍五入,它將去掉它。剩下的唯一問題是,我檢查是否需要銀行家四舍五入的if陳述句不起作用了。
uj5u.com熱心網友回復:
這里是:
// Ex. 5.31: DollarAmount.h
// DollarAmount類得到兩個引數的建構式。
#include <string>/span>
#include <cmath>
#include <iostream>
class DollarAmount {
public:
//從一個int64_t值初始化金額。
explicit DollarAmount(int64_t dollars, int64_t cents) /span> 。amount{美元 * 100 cents}。{ }
//將右邊的金額添加到這個物件的金額中。
void add(DollarAmount right) {
amount = right.amount。
}
//從這個物件的金額中減去right的金額。
void subtract(DollarAmount right) {
//可以訪問同一類其他物件的私有資料。
amount -= right.amount。
}
//用除數除以金額。
void divide(int divisor) {
amount = (amount divisor / 2) / divisor;
}
//使用整數算術來計算利息金額,//使用整數算術來計算利息金額。
//然后用利息金額呼叫add。
void addInterest(int rate, int divisor) {
//span>創建代表利息的DollarAmount。
DollarAmount interest {
((金額*利率 除數/2)/除數) / 100, //美元.
((金額*匯率 除數/2) /除數) % 100 // cents
};
add(interest); //將利息加入此物件的金額。
}
//回傳一個DollarAmount物件的字串表示。
std::string toString() const{
std::string dollars{std::to_string(an amount / 100)}。
std::string cents{std::to_string(std::abs( amount % 100))}。
return dollars "." (cents.size() == 1 ? "0"/span> : ""/span>) 分數。
}
void bankersRounding(){
std::cout << "錢。" << amount << " cents" << std::endl;
int dollarsPart = amount/100;
int penniesPart = amount%100;
std::cout << " - dollars: " << dollarsPart << std::endl;
std::cout << " - pennies: " << penniesPart << std::endl;
//如果它與上層和下層的整數距離相等,
//然后應用銀行家的舍入法。
if (penniesPart==50)
{
//如果較低的整數是0,則向下舍入為0。
if( dollarsPart==0)
{
std::cout << "它是零" << std::endl;
amount -= 50;
}
//如果較低的整數是偶數,則向下取整。
else if ((dollarPart%2) ==0)
{
std::cout << "even" << std::endl;
amount -= 50;
}
//else the lower integer is odd, so round up.
else {
std::cout << "odd" << std::endl;
amount = 50;
}
}
}
private:
int64_t amount{0}; // dollar amount in pennies.
};
int main()
{
DollarAmount d1(0, 0);
DollarAmount d2(0, 50);
d1.add(d2)。
d1.bankersRounding()。
std::cout << "final: " << d1.toString() << std::endl。
return 0。
uj5u.com熱心網友回復:
我不確定你是在哪一點上被卡住了,但也許你正在尋找這樣的東西:
nearest_even=round(x/2)*2。
我認為這是一個相當簡單的 "銀行家四舍五入 "的實作。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/314112.html
標籤:
