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++日本語リファレンス

※間違ってたらすみません。
わかった時点で修正します。

コメント

このブログの人気の投稿

ダイソー テープライト リモコン付 分解

Unity ADX2LE 演出付きでBGMを再生する CriAtomExPlayer