皆さん、私は単純なグラフ ドロワーを作成しており、水平線の美しい値を見つけたいと考えています。たとえば、値が 72089.601562 の場合、beautiful は 70000 または 75000 です。つまり、beautifulNumber%5 = 0 だと思います。何かアイデアはありますか?
4 に答える
これはどう?
#import <math.h>
#import <stdio.h>
#define ROUNDING 5000
int beautify(float input)
{
// Cast to int, losing the decimal value.
int value = (int)input;
value = (value / ROUNDING) * ROUNDING;
if ((int)input % ROUNDING > ROUNDING / 2 )
{
value += ROUNDING;
}
return value;
}
int main()
{
printf("%d\n", beautify(70000.601562)); // 70000
printf("%d\n", beautify(72089.601562)); // 70000
printf("%d\n", beautify(76089.601562)); // 75000
printf("%d\n", beautify(79089.601562)); // 80000
printf("%d\n", beautify(70000.601562)); // 70000
return 0;
}
下限値、上限値、または最も近い 5000 に丸めるだけかどうかによって異なります。
下限値の場合:
int beautiful = (int)(floor(ugly / 5000.0) * 5000.0);
上限値の場合:
int beautiful = (int)(ceil(ugly / 5000.0) * 5000.0);
丸めの場合:
int beautiful = (int)(round(ugly / 5000.0) * 5000.0);
グラフの線を作成するには、グラフ化する必要がある最小値と最大値を見つけ、最小値の下限値から始めて、最大値を超えるまで希望の間隔を追加します。
例えば:
float minValue = 2.34;
float maxValue = 7.72;
int interval = 1;
NSMutableArray *horizLines = [NSMutableArray array];
int line = (int)(floor(minValue / interval) * interval);
[horizLines addObject:[NSNumber numberWithInt:line]];
do {
line = (int)(ceil(minValue / interval) * interval);
[horizLines addObject:[NSNumber numberWithInt:line]];
if (minValue >= maxValue) break;
minValue = minValue + interval;
}
必要に応じて使用してください!
あなたがやりたいことは1桁またはおそらく2桁の有効数字に丸められるように聞こえます。有効数字n桁への丸めは非常に簡単です。
double roundToNDigits(double x, int n) {
double basis = pow(10.0, floor(log10(x)) - (n-1));
return basis * round(x / basis);
}
これはあなたroundToNDigits(74518.7, 1) == 70000.0
にroundToNDigits(7628.54, 1) == 8000.00
1桁または2桁(2桁目が5の場合は2桁のみ)に丸める場合は、次のようにします。
double roundSpecial(double x) {
double basis = pow(10.0, floor(log10(x))) / 2.0;
return basis * round(x / basis);
}
そうですね、数値のサイズに基づいてスケーリングする必要があるようです。範囲が 10 までしかない場合、最も近い 5,000 に丸めるのは明らかに意味がありません。ビットシフトを使用してコーディングするための非常にエレガントな方法がおそらくありますが、次のような方法でうまくいきます。
float value = 72089.601562
int beautiful = 0;
// EDIT to support returning a float for small numbers:
if (value < 0.2) beautiful = int(value*100)/100.;
else if (value < 2.) beautiful = int(value*10)/10.;
// Anything bigger is easy:
else if (value < 20) beautiful = (int)value;
else if (value < 200) beautiful = (int)value/10;
else if (value < 2000) beautiful = (int)value/100;
else if (value < 20000) beautiful = (int)value/1000;
// etc