答案 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.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);
}