带小数位的 BigInteger 字符串表示形式

发布于 2025-01-08 08:36:53 字数 512 浏览 2 评论 0原文

我试图创建一个大整数除以某物时的十进制表示形式。下面是执行此操作的代码,基本上我希望精度为 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;
    }
}

请问有更好的方法吗?

谢谢, -麦克风

I'm trying to create a decimal representation of a big integer when it's divided by something. The follwoing is the code which does it, basically I want the precision to be of 2 places.

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

Is there a better way of doing this please?

Thanks,
-Mike

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

季末如歌 2025-01-15 08:36:53

您可能不应该自行转换类型并进行长除法。这应该适用于任何 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;
}

You should probably not convert the types and do the long division on your own. This should work with any BigInteger value.

I'm sure there's room for improvement here...

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;
}
眼泪都笑了 2025-01-15 08:36:53

内置的 .net decimal 类型为 128 位,可与其他类型的类似舍入结构配合使用。这个数字还不够大吗?

The built in .net decimal type is 128bit, and works with similar rounding constructs of other types. Is this number not large enough?

捂风挽笑 2025-01-15 08:36:53

而不是对其进行数学运算,特别是使用不太精确的类型(例如 double)。
只需构建一个包含除最后两位数字之外的所有数字的字符串,附加一个小数点,然后放入最后一个数字。

例如

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, ".");

Instead of doing maths on it especially using less accurate types like double.
simply build a string with all but the last two digits, append a decimal point and then put the last one in.

e.g. Something like

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, ".");
中二柚 2025-01-15 08:36:53
var s=((bigInteger*200+divisor)/(2*(BigInteger)divisor)).ToString();
return s.Insert(".",s.Length-2);

此代码仅适用于正值,并使用 AwayFromZero 中点舍入。我也不关心本地化问题。

var s=((bigInteger*200+divisor)/(2*(BigInteger)divisor)).ToString();
return s.Insert(".",s.Length-2);

This code only works for positive values, and uses AwayFromZero midpoint rounding. I also didn't care about localization issues.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文