[編集] OP は、印刷された値のみを小数点以下 2 桁に丸める必要があることを明確にしました。
「偶数への丸め」または「ゼロからの丸め」ごとに「途中で」数値を丸めるというOPの観察は誤解を招くものです。0.005、0.015、0.025、... 0.995 のような 100 個の「中途半端な」数値のうち、通常、正確に「中途半端」なのは 0.125、0.375、0.625、0.875 の 4 つだけです。これは、浮動小数点数の形式が基数 2 を使用し、2.565 のような数値を正確に表すことができないためです。
代わりに、次のようなサンプル番号は、 binary64を想定し2.565
た最も近いdouble
値に なります。その数値を 0.01 に最も近い値に丸めると、OP が要求する 2.57 ではなく 2.56 になるはずです。2.564999999999999947...
したがって、0.125 および 0.625 で終わる数値のみが、OP の要求どおりに正確に半分になり、切り上げではなく切り捨てられます。それを受け入れて使用することを提案します:
printf("%.2lf",variable); // This should be sufficient
OP の目標に近づくには、数値を A) 0.125 または 0.625 で終わる値に対してテストするか、B) わずかに増加させることができます。最小の増加は
#include <math.h>
printf("%.2f", nextafter(x, 2*x));
@Clifford には、別のナッジ メソッドがあります。
double
[aを最も近いdouble
0.01 の倍数に丸める以前の回答]
典型的な浮動小数点は、基数 2 を使用するbinary64のような形式を使用します。「最も近い数学的 0.01 に丸め、0.0 から引き離す」ことは困難です。
@Pascal Cuoqが言及しているよう2.555
に、通常のような浮動小数点数は近くにあるだけで、半分ではない2.555
ようなより正確な値を持っています。2.555000000000000159872...
以下の @BLUEPIXY ソリューションが最適で実用的です。
x = round(100.0*x)/100.0;
「ラウンド関数は、現在の丸め方向に関係なく、引数を浮動小数点形式の最も近い整数値に丸め、ゼロから離れた中間のケースを丸めます。」C11dr §7.12.9.6。
この((int)(100 * (x + 0.005)) / 100.0)
アプローチには 2 つの問題があります。負の数の場合は間違った方向に丸められる可能性があり (OP では指定されていません)、通常、整数の範囲 ( INT_MIN
~INT_MAX
)ははるかに小さくなりますdouble
。
double x = atof("1.115");
1.12 の近くで終了する場合のような場合がまだいくつかあります1.11
。これ1.115
は、adouble
が実際には に近く、1.11
「中途半端」ではないためです。
string x rounded x
1.115 1.1149999999999999911182e+00 1.1200000000000001065814e+00
OP は、負の数の丸めを指定していませんy = -f(-x)
。