Как умножить BigInteger на десятичную? - PullRequest
0 голосов
/ 21 октября 2018

Как умножить BigInteger на десятичное число в C #?

var bi = new BigInteger(1000);
var d = 0.9m;
// HowTo:
var res = BigInteger.Multiply(bi, d); // res = 900

Конечно, результат должен быть floored вплоть до предыдущего полного целочисленного значения.

Имеется практическая основа, но что касается опубликованного «дубликата», меня также интересует ответ на вопрос с теоретической точки зрения.Я не ищу обходной путь, используя вместо этого двойной.

1 Ответ

0 голосов
/ 21 октября 2018

Вы можете представить decimal как дробь

(BigInteger numerator, BigInteger denominator) Fraction(decimal d) {
    int[] bits = decimal.GetBits(d);
    BigInteger numerator = (1 - ((bits[3] >> 30) & 2)) *
                           unchecked(((BigInteger)(uint)bits[2] << 64) |
                                     ((BigInteger)(uint)bits[1] << 32) |
                                      (BigInteger)(uint)bits[0]);
    BigInteger denominator = BigInteger.Pow(10, (bits[3] >> 16) & 0xff);
    return (numerator, denominator);
}

Затем вы можете умножить BigInteger на числитель и разделить на знаменатель:

var bi = new BigInteger(1000);
var d = 0.9m;
var f = Fraction(d);
var res = bi * f.numerator / f.denominator;
...