繁体   English   中英

四舍五入具有非零十进制数字的浮点数

[英]Round up a float number that has a non-zero decimal digit

我今天早些时候询问了大约一半的数字,并从@alk获得了很大的帮助。 在那篇文章中,我的想法是将4.5舍入为5,但将4.4舍入为4。@ alk提供的解决方案是:

int round_number(float x)
{
 return x + 0.5;
}

而且效果非常优雅!

在本文中,我想讨论如何在C中实现ceil()函数。与@alk提供的最后一个解决方案相同,我提出了以下内容:

int round_up(float y)
{
   return y + 0.99999999;
}

这适用于所有情况,但浮点数y为.00000001时除外。 我想知道是否有更好的方法可以与C中的ceil()相同。

除非您可靠地知道float的epsilon(我不确定标准C是否提供了该函数),否则我认为您会陷入return (y < 0 || y == (int)y) ? y : y + 1; return (y < 0 || y == (int)y) ? y : y + 1;

对于负数,此操作将失败。

int round_up(float y) {
 return y + 0.99999999;
}

但是,让我们利用它来发挥优势。 floatint转换将截断为0.0。 因此,负数正在执行“向上舍入”或“上限”功能。 当我们有一个正float ,请转换为int注意这是一个“ floor”函数。 y不是整数时进行调整。

(假设y INT_MIN ... INT_MAX 。)

int ceil(float y) {
   if (y < 0) {
     return y;  // this does a ceiling function as y < 0.
   }
   int i = y; // this does a floor function as y >= 0.
   if (i != y) i++;
   return i;
 }

void ceil_test(float y) {
   printf("%f %d\n", y, ceil(y));
}

第一个代码段不能正确处理负数。 -3.5将是-3,而不是-4。 要正确舍入值

int round_number(float x)
{
    if (x >= 0)
        return x + 0.5f;
    else
        return x - 0.5f
}

即使那样,它对于2个值仍然是不正确的。 请参阅Math.round(0.49999999999999994)为什么返回1? 请注意,您需要使用f后缀来获取float文字,否则该操作将以double精度进行,然后向下转换为float

对于上限,加1就足够了

int ceiling(float x)
{
    if (x < 0 || (int)x == x)
        return x;
    else
        return x + 1.0f;
}

当x是整数时,例如x = 3.0(或-3.0),则返回3(或-3)。 对于x = 3.1则返回4,对于x = -3.1则返回-3

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM