繁体   English   中英

四舍五入一个整数,使其乘以浮点数将返回整数

[英]Rounding an integer such that multiplying it by a float returns a whole number

我正在开发图像缩放应用程序,并给出了缩放比例和矩形。 我需要将矩形乘以比率,还要确保生成的矩形仅由整数组成(即没有浮点数)。 如果不是,我想扩展源Rectangle,以使上述条件成立。

目前,我正在强行强制执行(下面的代码)。 但是我很确定有一种使用聪明数学的方法。

RECT AdjustRectWholeNumber(RECT SrcRect, float ratio)
{
    RECT adjustedRect = SrcRect;
    while (!isWholeNumber(adjustedRect.left * ratio))
    {
        adjustedRect.left--;
    }
    while (!isWholeNumber(adjustedRect.top * ratio))
    {
        adjustedRect.top--;
    }
    while (!isWholeNumber(adjustedRect.right * ratio))
    {
        adjustedRect.right++;
    }
    while (!isWholeNumber(adjustedRect.bottom * ratio))
    {
        adjustedRect.bottom++;
    }
    return adjustedRect;
}

示例:给定rect(78,188,1068,790)和比率1.25,它应该返回(76、188、1068、792)

推理:如果我将(78,188,1068,790)乘以1.25,它将得到我(97.5、188、1068、987.5)。 这不是理想的,因为如果我四舍五入(向上或向下)缩放的矩形,则会失去精度,这会在屏幕上显示为小的损坏伪影。 好像我们扩展了源矩形,以便在乘以比例因子后得到所有整数,而不会损失任何精度,因此不会看到损坏。

注意:缩放比例保证可以产生整数

任何帮助表示赞赏!

编辑:根据要求为isWholeNumber添加代码

bool isWholeNumber(float f)
{
    if (floor(f) == f)
        return true;
    return false;
}

为了澄清起见,假设我将获得的唯一比率是(1.25、1.5、1.75、2.0、2.25)

我认为一般来说,您所说的问题没有好的解决方案。 并非所有的“好”分数都有精确的表示为浮点数(例如4/3却没有)。 通常,仅对于以2的幂为分母的那些分数,才可能精确表示。 而且,如果尝试按原样对“不良”分数使用float逼近,则会得到分母约为2^-20即约10^-6拟合)的分数。 因此,明显的建议是使用某些显式自定义类型将分数表示为显式(整数)分母和分母。 而且,如果您有一个明确的分母值,那么任务就变得微不足道了。 或者,如果您确定

我唯一会得到的比率是(1.25、1.5、1.75、2.0、2.25)

你可以有一个简单的函数,将匹配值,并说,如果分母是124 如果您有更多可能的值,但所有分数均具有2分母的幂,则还可以考虑使用frexp / frexpf来获取指数(分母2的幂)

因此,现在有了分母时,一切都变得非常简单:您只需要找到一个可被其整除的数字。 您可以通过整数除法和乘法来实现(假设您的值是正数):

int roundDown(int value, int denominator) {
    return (value / denominator) * denominator;
}

int roundUp(int value, int denominator) {
    return ((value + denominator - 1) / denominator) * denominator;
}

暂无
暂无

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

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