【问题标题】:Attach decimal part to an integer将小数部分附加到整数
【发布时间】:2014-06-08 16:52:56
【问题描述】:

我需要能够将一个整数作为小数部分附加到另一个整数上,例如:

对于数字 1234512345678 我想得到:12345,12345678

注意:数字的长度是可变的。

我尝试将数字转换为字符串以测量它们的长度,然后将它们相应地划分,但必须有比这更有效和快速的方法。

【问题讨论】:

  • 您确定您当前的方法对于您的案例来说太慢了吗?或者这个问题只是关于完成任务的方法的兴趣?
  • @AlexanderManekovskiy 我正在对几百万个数字对执行此操作,这需要相当长的时间,我想它可能会更快。

标签: c#


【解决方案1】:
var left = 12345;
var right = 12345678;
var total = left + (right / Math.Pow(10, Math.Floor(Math.Log10(right)) + 1));

【讨论】:

  • 感谢您的回答,但是当right 为零时,您的解决方案将失败。
  • @DougPeters :我认为您需要对零值进行特殊处理。
【解决方案2】:

一种非常快速而肮脏的方法,根本没有错误检查

var total = Double.Parse(string.Concat(left, ",", right));

【讨论】:

    【解决方案3】:

    基于https://stackoverflow.com/a/2506541/1803777,不使用对数函数可以获得更高的性能。

    public static decimal GetDivider(int i)
    {
        if (i < 10) return 10m;
        if (i < 100) return 100m;
        if (i < 1000) return 1000m;
        if (i < 10000) return 10000m;
        if (i < 100000) return 100000m;
        if (i < 1000000) return 1000000m;
        if (i < 10000000) return 10000000m;
        if (i < 100000000) return 100000000m;
        if (i < 1000000000) return 1000000000m;
        throw new ArgumentOutOfRangeException();
    }
    
    int a = 12345;
    int b = 12345678;
    decimal x = a + b / GetDivider(b);
    

    【讨论】:

    • 如何扩展以包括 BigInteger 范围?我不想写几百行if。有什么想法吗?
    • @DougPeters 对于小数点后的位数,您打算使用什么类型?从技术上讲,您可以使用 while 循环来计算除数。
    【解决方案4】:

    尝试使用以下方法进行计数:

    Math.Floor(Math.Log10(n) + 1);
    

    然后按照你说的继续。

    来源:How can I get a count of the total number of digits in a number?

    【讨论】:

      猜你喜欢
      • 2020-05-18
      • 1970-01-01
      • 2011-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多