圆润到“美丽”的价值

时间:2012-04-29 21:19:26

标签: iphone ios xcode floating-point int

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

4 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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;
} 

根据需要使用!

答案 2 :(得分: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

答案 3 :(得分: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);
}