如何将 BigInteger 与小数相乘?
How to multiply a BigInteger with a decimal?
如何在 C# 中将 BigInteger 与小数相乘?
var bi = new BigInteger(1000);
var d = 0.9m;
// HowTo:
var res = BigInteger.Multiply(bi, d); // res = 900
当然,结果应该floored到之前的完整整数值。
有实际背景,但关于已发布的"duplicate",我也有兴趣从理论角度回答问题。我不是在寻找使用 double 的解决方法。
您可以将 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;
如何在 C# 中将 BigInteger 与小数相乘?
var bi = new BigInteger(1000);
var d = 0.9m;
// HowTo:
var res = BigInteger.Multiply(bi, d); // res = 900
当然,结果应该floored到之前的完整整数值。
有实际背景,但关于已发布的"duplicate",我也有兴趣从理论角度回答问题。我不是在寻找使用 double 的解决方法。
您可以将 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;