我正在尝试创建一个大整数的十进制表示,当它除以某个东西时。下面是代码,它基本上我希望精度为2位。
public string GetDecimal(BigInteger bigInteger,int divisor)
{
var remainder = BigInteger.Remainder(bigInteger, divisor);
var dividend = BigInteger.Divide(bigInteger, divisor);
var d = ((double)remainder / divisor);
var decimalPart = Math.Round(d, 2);
var retValue = dividend + decimalPart.ToString(".00");
return retValue;
}
}
有没有更好的方法呢?
谢谢, -Mike
答案 0 :(得分:2)
您可能不应该转换类型并自行进行长除法。这应该适用于任何BigInteger值。
我确信这里有改进的余地......
public string GetDecimal(BigInteger bigInteger, int divisor)
{
BigInteger remainder;
var quotient = BigInteger.DivRem(bigInteger, divisor, out remainder);
const int decimalPlaces = 2;
var decimalPart = BigInteger.Zero;
for(int i = 0; i < decimalPlaces; i++)
{
var div = (remainder*10)/divisor;
decimalPart *= 10;
decimalPart += div;
remainder = remainder*10 - div*divisor;
}
var retValue = quotient.ToString() + "." + decimalPart.ToString(new string('0', decimalPlaces));
return retValue;
}
答案 1 :(得分:0)
内置的.net decimal
类型是128位,并且与其他类型的类似舍入结构一起使用。这个数字不够大吗?
答案 2 :(得分:0)
而不是对它进行数学运算,特别是使用不太精确的类型,如double。 只需构建一个包含除最后两位数之外的所有字符串的字符串,附加小数点,然后将最后一位放入。
e.g。像
这样的东西int precision = 2;
negative = 0;
if (bigInteger < 0)
{
negative = 1;
}
String strValue = bigInteger.ToString().PadRight(precision + negative + 1,'0');
return strValue.Insert(strValue.Length - precision, ".");
答案 3 :(得分:0)
var s=((bigInteger*200+divisor)/(2*(BigInteger)divisor)).ToString();
return s.Insert(".",s.Length-2);
此代码仅适用于正值,并使用AwayFromZero
中点舍入。我也不关心本地化问题。