伙计们,我正在制作简单的绘图抽屉,并想为水平线找到漂亮的值。例如,如果我的值等于 72089.601562,那么 beautiful 是 70000 或 75000。所以,我认为 beautifulNumber%5 = 0。你有什么想法吗?
问问题
395 次
4 回答
2
这个怎么样?
#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;
}
于 2012-04-29T21:27:47.520 回答
1
这取决于您是想要一个底值、一个上限还是只是四舍五入到最接近的 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;
}
根据需要使用!
于 2012-04-29T21:25:12.127 回答
0
好吧,您似乎希望它根据数字的大小进行缩放。如果范围仅达到 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
于 2012-04-29T21:29:14.193 回答
0
听起来你想要做的是四舍五入到 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),您需要类似:
double roundSpecial(double x) {
double basis = pow(10.0, floor(log10(x))) / 2.0;
return basis * round(x / basis);
}
于 2012-04-29T21:52:57.613 回答