浮動小数点演算で小数第N位まで計算して返却する関数を作ってみました。
浮動小数点演算
浮動小数点はプログラミング言語における型の一つで、仮数と指数で表現される数字のことを言います。
例えば、
0.625は1. 01×2 -1
のように2進数で表すことができるので浮動小数点です。
浮動小数点のコンピューター内部での扱いは少し複雑になるのでここでは割愛して、単純に説明するとC言語やC++では単に0.3とか小数で表記される値は浮動小数点です。
浮動小数点でよく使う関数
浮動小数点を扱うプログラミングで四捨五入、切り捨て、切り上げは非常によく使う関数です。
それぞれ、round、floor, ceilという標準関数が用意されています。
仕様は以下の通りです。
関数:double round(double dIn);
引数:dIn 浮動小数点の値
戻り値:四捨五入された値
関数:double floor(double dIn);
引数:dIn 浮動小数点の値
戻り値:切り上げた値
関数:double ceil(double dIn);
引数:dIn 浮動小数点の値
戻り値:切り捨てた値
同様の関数は、C言語やC++以外にJavaやPHPやデータベースであるOracleにも用意されています。
浮動小数点演算で小数第N位まで計算して返却する関数
私が、プログラミングを始めた当初から標準で用意されているround、floor、ceilに汎用性がないことが非常に疑問で不満でした。
round、floor、ceil は必ず小数以下を四捨五入、切り上げ、切り捨てを行います。
これでは汎用性がなく、実際にプログラムを行う際は、小数第N位まで必要になることがよくあります。
そこで、小数第N位まで計算して返却する関数round2、floor2、ceil2を作ってみました。
関数:double round2(double dIn, int nLen);
引数:dIn 浮動小数点の値, nLen 小数第N位
戻り値:四捨五入された値
関数:double floor2(double dIn, int nLen );
引数:dIn 浮動小数点の値, nLen 小数第N位
戻り値:切り上げた値
関数:double ceil2(double dIn, int nLen);
引数:dIn 浮動小数点の値, nLen 小数第N位
戻り値:切り捨てた値
以下がその関数と使用例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
#include "stdafx.h" #include <math.h> // 小数第N位四捨五入 double ceil2(double dIn, int nLen) { double dOut; dOut = dIn * pow(10.0, nLen); dOut = (double)(int)(dOut + 0.9); return dOut * pow(10.0, -nLen); } // 小数第N位切り捨て double floor2(double dIn, int nLen) { double dOut; dOut = dIn * pow(10.0, nLen); dOut = (double)(int)(dOut); return dOut * pow(10.0, -nLen); } // 小数第N位切り上げ double round2(double dIn, int nLen) { double dOut; dOut = dIn * pow(10.0, nLen); dOut = (double)(int)(dOut + 0.5); return dOut * pow(10.0, -nLen); } int _tmain(int argc, _TCHAR* argv[]) { double d1; double d2; d1 = 3.455; d2 = 0.544; printf("Initial value d1 = %f d2= %f\n", d1, d2); d1 = round2(d1, 2); d2 = round2(d2, 2); printf("Round test d1 = %f d2= %f\n", d1, d2); d1 = 3.455; d2 = 0.544; d1 = floor2(d1, 2); d2 = floor2(d2, 2); printf("Floor test d1 = %f d2= %f\n", d1, d2); d1 = 3.455; d2 = 0.544; d1 = ceil2(d1, 2); d2 = ceil2(d2, 2); printf("Ceil test d1 = %f d2= %f\n", d1, d2); return 0; } |
実行結果は以下の通りです。
1 2 3 4 |
Initial value d1 = 3.455000 d2= 0.544000 Round test d1 = 3.460000 d2= 0.540000 Floor test d1 = 3.450000 d2= 0.540000 Ceil test d1 = 3.460000 d2= 0.550000 |
これらの関数は標準で用意してほしい関数ですが、どういう訳か用意されていないのでいつも自分で作っています。
round、floor、ceilを使う時の注意点
まず、それぞれの単語の意味を理解しましょう。
round:文字通り丸めるです。
floor:床です。床に近づける、つまり切り捨てるです。
ceil:ceiling天井のことです。天井に近づける、つまり切り上げです。
「Error: 識別子”pow”が定義されていません」というエラーメッセージが出ることがあります。
include<math.h>が必要です。
プログラミングの無料レッスン体験
約8,000名の受講生と80社以上の導入実績のあるプログラミングやWebデザインのオンラインマンツーマンレッスンCodecamp
<Codecampの特徴>
1 現役エンジニアによる指導
2オンラインでのマンツーマン形式の講義
3大手企業にも導入されている実践的なカリキュラム
↓無料体験レッスン実施中です。
コメント
使用例のroundとcailのコメントが逆になっていませんか?