c# - 如何将 BigInteger 与小数相乘?

标签 c# .net biginteger

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

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

当然,结果应该floored到之前的完整整数值。

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

最佳答案

您可以将小数表示为分数

(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;

关于c# - 如何将 BigInteger 与小数相乘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52917342/

相关文章:

c# - LINQ c#效率

php - 如何将 6+31 个数字字符塞入 22 个字母数字字符?

java - 如何将2048位的BigInteger分解成固定数量的64位的字?

c# - 从服务端访问 WCF 身份验证信息

C#.Net 将字符串转换为 double 和 int 处理空字符串

c# - LinqToXml 还是 Xml?

c++ - 我应该使用什么算法进行高性能大整数除法?

c# - WPF框架如何处理MVVM中属性的循环更新?

c# - 如何将可枚举类型转换为 AsyncEnumerable 类型?

c# - 为什么在包含yield return的函数中重复调用using(){} block ?