分数部分的数字问题

时间:2009-05-17 19:02:25

标签: math rounding floor ceiling

在不使用内置天花板或楼层功能的情况下,确定添加/分配到数字所需的必要分数以便将其四舍五入到最接近的整数有什么好的算法?

编辑:寻找一个数学数字技巧,找出将数字四舍五入到最接近的整数所需的部分。数学运算越原始越好。请避免使用其他程序。无论如何,无论如何都可以采取0.5。这不是我的作业问题,我也不会在任何地方使用它。

3 个答案:

答案 0 :(得分:4)

用一个来修改数字得到小数部分,如果它的> 0.5,向上舍入,否则向下舍入

OR

将数字除以0.5,如果是奇数,则向上舍入,否则向下舍入

答案 1 :(得分:3)

如果你不能使用mod(因为它可能只为你的语言中的整数定义,你可能会做这样的事情(在C-ish伪代码中):

// make the input positive:
boolean inputPositive = true;
if (input < 0) {
  input = 0 - input;
  inputPositive = false;
}

// subtract 1 until you just have the decimal portion:
int integerPart = 0;
while (input > 1) {
  input = input - 1;
  integerPart++;
}

int ret;
if (input >= 0.5) { // round up
  ret = integerPart + 1;
} else {
  ret = integerPart;
}

if (inputPositive) {
  return ret;
} else {
  return 0 - ret;
}

此解决方案不使用mod或任何外部函数。当然,我无法想象为什么你会在现实生活中想要这个。不过,考虑一下这很有意思。

答案 2 :(得分:3)

一旦你得到数字的小数部分,问题就解决了。获得小数部分的一种方法是从你的数字中重复减去2的幂(假设它已被设为正数,如果它是负数则开始)。

下面的函数getWholeMaker会返回您想要的内容(必须添加的“东西”以对数字进行舍入)。它的运行时间为O(log(n)),仅使用基本操作。

/* Returns the factional part of x */
double getFrac(double x) {
    if(x < 0) x = -x;
    if(x < 1) return x;
    else if(x < 2) return x-1;

    /* x >= 0 */
    double t = 2;
    while(t+t <= x) t += t;
    /* t is now the largest power of 2 less than or equal to x */
    while(t >= 1) {
        if(t <= x) x -= t;
        t /= 2;
    }

    return x;
}

double getWholeMaker(double x) {
    double frac = getFrac(x);
    double sign = x >= 0 ? +1 : -1;
    return sign * (frac <= 0.5 ? -frac : 1-frac);
}