具有小数位的BigInteger字符串表示

时间:2012-02-22 20:41:55

标签: c# c#-4.0 biginteger

我正在尝试创建一个大整数的十进制表示,当它除以某个东西时。下面是代码,它基本上我希望精度为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

4 个答案:

答案 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中点舍入。我也不关心本地化问题。