C++ round関数を使わずに小数第n位の四捨五入をする
C++でround関数を使わずに小数第n位の四捨五入を行う
サンプルプログラム1
#include <iostream>
#include <cmath>
using namespace std;
double round(double x, double n); //プロトタイプ宣言
int main() {
//round(数値, 小数位);
cout << round(66.5882, 3); //66.5882を小数点以下第3位を四捨五入 結果:66.59
return 0;
}
double round(double x, double n){
int temp = x * pow(10.0, n); //入力した値を10^n倍する
if((temp%10) >= 5){ //1の位の余りが5以上の場合
temp = temp + (10 - temp%10); //10から1の位の余りを引いて、値に足す
return (double)temp * pow(10.0, -n); //計算結果を返す
}else{ //1の位の余りが5未満の場合
temp = temp - temp%10; //1の位の余りを引く
return (double)temp * pow(10.0, -n); //計算結果を返す
}
}
サンプルプログラム1では関数を自作して処理を行っている。
そのため、主に解説していくのは下に記述されている自作round関数である。
動作原理は簡単で、四捨五入をしたい桁数を指定したらその分、10n倍して、1の位の余りを求める。
その余りが5以上か未満かで判別して、余り分を引くか「10―余り分」を足すかを決めている。
そして、値を逆に10-n倍して返している。
ちなみに、10n倍している理由は%を使用して余りを求めるためである。
浮動小数点は%を使用して余りを求めることができないからである。
cmathがインクルードされているためfmod関数を使用することができるが、このプログラムを作成した時の気分で使わなかった。
数式は以下に示す。
$temp=x10^{n}$
$temp \mod 10 \geqq 5$ の場合
$ans = temp + \{10 - (temp \mod 10)\}\times10^{-n}$
$temp \mod 10 \lt 5$ の場合
$ans = \{temp - (temp \mod 10)\}\times10^{-n}$
ほかにもっといいアルゴリズムがあるかもしれないので、参考程度にしてほしい。
round関数については参考文献[1]を見てほしい。
参考
[1] round - cpprefjp C++日本語リファレンス
※間違ってたらすみません。
わかった時点で修正します。
コメント
コメントを投稿