如何将 BigInteger 与小数相乘?

D.R*_*.R. 3 .net c# biginteger

如何在 C# 中将 BigInteger 与小数相乘?

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

当然,其结果应地板下降到以前的完全整数值。

有一个实际的背景,但关于发布的“重复”,我也有兴趣从理论的角度回答这个问题。我不是通过使用 double 来寻找解决方法。

use*_*407 8

您可以表示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);
}
Run Code Online (Sandbox Code Playgroud)

然后你可以乘以BigInteger分子并除以分母:

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