0

伙计们,我正在制作简单的绘图抽屉,并想为水平线找到漂亮的值。例如,如果我的值等于 72089.601562,那么 beautiful 是 70000 或 75000。所以,我认为 beautifulNumber%5 = 0。你有什么想法吗?

4

4 回答 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.0roundToNDigits(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 回答