Как сделать расчет за пределы Int32 / 64? - PullRequest
0 голосов
/ 26 мая 2019

Мое приложение имеет дело с вычислением больших чисел.Как я могу умножить два целых числа и получить продукт как BigInteger без переполнения?В частности, я должен получить "BaseCost" x ("multiplier" by the power of "level")

Я проверил, что "new BigInteger(100000000000000000000000)" не работает.Поэтому я не думаю, что "if(BigInteger > (BigInteger)(Int1 * float1))" будет работать.Вероятно, он будет переполнен в части "(Int1 * float1)".

1 Ответ

0 голосов
/ 27 мая 2019

Так вот как я исправил проблему. Я использовал BigDecimal из JcBernack в GitHub, и это следующий код.

private BigInteger Example
{
    get
    {
        return (BigInteger)(new BigDecimal(Int1) * Float2);
    }
}

Я использовал класс BigDecimal, так как не мог умножить BigInteger на число с плавающей точкой. Кроме того, перед использованием класса я обязательно добавил заклинателя BigInteger (из комментария uhDreamer).

public static explicit operator BigInteger(BigDecimal value)
{
    BigDecimal floored = value.Floor();
    return floored.Mantissa * BigInteger.Pow(10, floored.Exponent);
}

И конструктор Int.

public BigDecimal(int t)
{
    Exponent = 0;
    Mantissa = t;
    Normalize();
    if(AlwaysTruncate)
    {
        Truncate();
    }
}

Теперь разработчики, которым просто нужно умножить целые числа, могут сделать это Int1(BigInteger) * Int2.

И, конечно же, не забудьте про пространство имен System.Numerics.

...