5

我想将一个浮点数向下舍入,这样我得到的值将在 0.5 到 7 之间(任何小数位数),同时将低于 0.5 的任何值舍入到 0.5。

例如,

0.1, 0.11442, 0.46 would all be 0.5.
1.1, 1.43, 1.35 would all be 1.
1.56, 1.6, 1.8 would all be 1.5.

任何超过 5 的都将向下舍入到 5。

我想要的最终数据集是0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5.

我不知道任何向下舍入的函数Objective C,而不是整数。

4

4 回答 4

24

floor()会将浮点数向下舍入到下一个整数。如果先乘以 2,向下取整,然后除以 2,您将得到所需的结果。

float rounded = value < 0.5f ? 0.5f : floorf(value * 2) / 2;
于 2013-04-21T14:08:40.013 回答
0

要“四舍五入”间隔,请添加一半的间隔并截断到间隔边界。

对于四舍五入到最接近的 int ,(int) (value + 0.5)但它是一个具有 0.5 边界的头发棘手 - 添加一半的间隔很容易,但截断到 0.5 边界不是。

所以最实用的方法是将数字加倍,四舍五入到一个int边界,然后除以2。

另一种方法是将整数部分和小数部分分开 ( fraction = value - (int) value;),然后使用简单的“if ladder”分别格式化小数部分。(当心——负数可能很棘手。)如果您需要四舍五入到一些不规则的边界集,这可能是一个更好的选择。

于 2013-04-21T14:30:24.620 回答
0

第一条评论很好,但它跳过了零和负值.. 我的 5 美分:

float roundToHalf (float val)
{
    if (val==0) return 0;
    int sign = fabs(val)/val;
    return sign * (fabs(val) < 0.5f ? 0.5f : floorf(fabs(val)) * 2 / 2);

}
于 2013-09-25T15:17:01.620 回答
0

好吧,我注意到,由于浮点代数,通过除法确定符号(如图所示)是胡说八道。在许多系统上它也很慢。

float round_half_f(float val) {
  short sign = (short)(val / fabs(val) );
  return floorf(fabs(val)*2.f) / 2.f * sign;
}

做这个:

float round_half_f(float val) {
  short sign = val < 0 ? -1 : 1;
  return floorf(fabs(val)*2.f) / 2.f * sign;
}
于 2014-04-04T09:29:09.440 回答