有没有一种方法可以对BigInteger取整或向上取整?

3

我有一个BigIntiger,比如说1234567890,我正在寻找将其转换为以下任何一种形式的最快方法:

  • 2000000000
  • 1300000000
  • 1234567900

注:BigIntiger是指大整数。

1
每个输入有3个输出? - Lei Yang
任何一种方法都可以接受。我只是想将数字四舍五入,这样当我将其除以其他数字时就没有余数了。 - user1873073
1
如果这就是你想要的,那么解决方案似乎非常清晰。要么(1)将它除以该数字然后再乘以该数字,要么(2)找到余数并减去它。 - Eric Lippert
2
我还注意到您并不是在寻找最快的解决方案,因为您可能不愿意花费数百万美元来购买定制硬件,以便在纳秒而非皮秒内解决此问题。您正在寻找在特定预算范围内的可接受的快速解决方案,就像我们所有人一样。 - Eric Lippert
尽我所能快速翻译。现在我检查了一下,你的解决方案相当明显。谢谢! - user1873073
2个回答

3
我认为没有内置的方法来实现这个。
获取“无余数”的最简单方法是通过减去余数:
对于13进行“四舍五入”以不产生余数:
  var x = new BigInteger(123456);
  var roundedTo13 = x - (x % 13);

转换为100:

  var roundedTo100 = x - (x % 100);
  Console.WriteLine(roundedTo100);

如果你需要更传统的四舍五入 - 检查余数是否大于你想要进行舍入的值和你想要舍入的数字的符号。如果余数的值(x%100)大于一半,则需要加/减100。

0
另一种方法是将字符串分割。虽然可能会有性能问题,但结果还可以接受。
    //n=1, 2, 8 to check for your example
    static long F(long num, int n)
    {
        string all = num.ToString();
        long headn = Convert.ToInt64(all.Substring(0, n)) + 1;
        return (long)(headn * Math.Pow(10, all.Length - n));
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接