【问题标题】:How do I combine two integers in C#?如何在 C# 中合并两个整数?
【发布时间】:2015-12-29 17:27:35
【问题描述】:

假设我有以下代码:

int digit1 = 1;
int digit2 = 3;

我需要合并这两个整数,得到一个等于13.0f 的浮点数。这可能很容易,因为我是 C# 新手,并且是从一本书中学习的,但是它是如何完成的呢?

例子:

int digit1 = 3;
int digit2 = 6;
float result = combine_integers (digit1, digit2);
// result = 36

注意:
我实际上并不需要一个函数。我只是为了示例而这样做。

【问题讨论】:

    标签: c# floating-point int


    【解决方案1】:
    float combine_integers (int digit1, int digit2)
    {
        return 10*digit1 + digit2;
    }
    

    示例

    combine_integers(1, 3) ==>
    10 * 1 + 3 ==>
    10 + 3 ==>
    13
    

    combine_integers(3, 6) ==>
    10 * 3 + 6 ==>
    30 + 6 ==>
    36
    

    【讨论】:

    • 非常干净和聪明。
    • 如果 digit2 为负数会怎样?
    • 负值未在原始问题中描述,也未在给出的示例中说明。也不是多位数示例,例如{12,34},因此我的解决方案未涵盖这些示例。
    • 有效,但代码中完全没有意图,您必须解释它而不是阅读它。
    • @RicardoRodrigues:这就是编程。我希望任何学生都应该能够解释我的函数中的一行代码,尤其是提供的示例。
    【解决方案2】:

    如果您的整数是个位数,那么上面 abelenky 的答案将为您提供最快的答案。如果它们不是单个数字,那么您可以像上面那样执行 string.Format(),但还有一些未涵盖的边缘情况,例如负值或两个值都为 0。

    上述字符串操作可能会产生“00”、“5-1”等结果,或者由于无法解析字符串结果而引发错误。在 {5,-1} 的情况下,您可能会得到 49。

    我要做的是覆盖我的基础并假设如果您使用负数,您需要绝对值。此代码还涵盖了单个数字的基本情况,但为您提供了一些灵活性,以便 combine_integers(12,34) 返回 1234.0f。

        static float combine_integers (int digit1, int digit2)
        {
            int checker = Math.Abs(digit2);
            int result = Math.Abs(digit1);
            do
            {
                result *= 10;
                checker /= 10;
            } while(checker>0);
            result += Math.Abs(digit2);
            return (float)result;
        }
    

    【讨论】:

    • 对于一个非常简单的问题,这里的代码量只是纯粹的过度工程。让我们保持简短。
    【解决方案3】:
    private static float combine_integers(int a, int b)
    {
        return float.Parse(a.ToString() + b.ToString());
    }
    

    https://dotnetfiddle.net/M9Bpwt

    【讨论】:

    • 转换为字符串只是为了组合并转换回浮点数?性能大幅下降!
    • 如果 b 是负值,这也会提供潜在的 System.FormatException。
    • 这是最高效的解决方案吗?可能不是。我们是否知道需要什么样的性能?没有。因此,在我们对性能感到兴奋之前,让我们退后一步。你知道他们怎么说早期优化。
    【解决方案4】:

    试试这个代码:

    int digit1 = 3;
    int digit2 = 6;
    string concat = string.Format("{0}{1}", digit1, digit2);
    float result = float.Parse(concat);
    

    【讨论】:

    • string.Format 很慢!
    • 如果 digit2 是负数,您的代码将抛出 System.FormatException,因为“3-6”不是数字的有效表示。
    • @abelenky 也一样。我们不知道需要多少性能。假设是错误的。如果它如此糟糕,为什么它会在 BCL 中?这段代码清楚地表达了它的意图,而你的则根本没有。
    • String.Format 非常适合许多字符串操作,这就是它在库中的原因。然而,它适合数学运算。它是一个字符串函数,而不是一个数学函数。
    • 它是一个字符串函数。我们可以随便看看这个。如果我们愿意,加入这些数字甚至可以是一个数组操作。让我们客观一点。
    猜你喜欢
    • 2023-01-23
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    相关资源
    最近更新 更多