如何从浮点数计算宽高比

时间:2010-02-16 16:02:08

标签: c#

我给了一个浮动数字,例如1.77720212936401,我希望能够大致计算宽高比的宽度:高度字符串,宽度和高度是小的自然数。

JD

///

我想出了这个,目前正在测试它是否涵盖所有领域:

    static public string Ratio(float f)
    {
        bool carryon = true;
        int index = 0;
        double roundedUpValue = 0;
        while (carryon)
        {
            index++;
            float upper = index*f;

            roundedUpValue = Math.Ceiling(upper);

            if (roundedUpValue - upper <= (double) 0.1)
            {
                carryon = false;
            }
        }

        return roundedUpValue + ":" + index;
    }

4 个答案:

答案 0 :(得分:3)

尝试在循环中将它乘以小整数,并检查结果是否接近整数。

double ar = 1.7777773452;
for (int n = 1; n < 20; ++n) {
    int m = (int)(ar * n + 0.5); // Mathematical rounding
    if (fabs(ar - (double)m/n) < 0.01) { /* The ratio is m:n */ }
}

答案 1 :(得分:1)

查看wikipedia,使用预定义的值并估算最接近的比率。

答案 2 :(得分:0)

也许它是1.777:1但是当你告诉我们这么少时很难确定。

答案 3 :(得分:0)

在大多数情况下,实际输入不是浮点数,但是您有宽度高度,并且您可以通过除以它们来获得浮点数。

在这种情况下,问题可以减少到找到greatest common divisor

private static int greatestCommonDivisor(int a, int b) {
    return (b == 0) ? a : greatestCommonDivisor(b, a % b);
}

private static String aspectRatio(int width, int height) {
    int gcd = greatestCommonDivisor(width, height);

    if (width > height) {
        return String.Format("{0} / {1}", width / gcd, height / gcd);
    } else {
        return String.Format("{0} / {1}", height / gcd, width / gcd);
    }
}