小数型変数であるdoubleやfloatは丸め誤差などの影響を受ける。
例えば、0.1ずつインクリメントしていても0.1999999のようになることがある。
実際は0.2として数値を扱いたいのに0.1999999では”==”などの演算子がうまく利用できない。
そこで、小数第n位を切り捨てもしくは四捨五入する方法を紹介する。
使用する関数は
floor(n) 小数部を切り捨てる関数。
引数nはfloat型 返り値はint型
round(n) 小数第一位を四捨五入する関数。
引数nはfloat型 返り値はint型
適用したい小数の位が小数第一位になるように10の冪乗を掛けてあげてから、
これらの関数を適用することで任意の桁で小数の切り捨て、四捨五入を適用することができる。
1 2 3 4 5 6 7 8 9 10 |
void setup(){ float f = 123.456; int n = 2;//小数第3位に対して処理を行う float f1 = float(floor(f*pow(10,n)))/pow(10,n);//切り捨て float f2 = float(round(f*pow(10,n)))/pow(10,n);//四捨五入 println("f1="+f1); println("f2="+f2); } |
1 2 |
f1=123.45 f2=123.46 |