BigInteger.ToString() 返回超过 50 位十进制数字

发布于 2024-09-05 00:38:59 字数 1030 浏览 11 评论 0原文

我正在使用 .NET 4 System.Numerics .BigInteger Structure 并且我得到的结果与文档不同。

BigInteger.ToString() 方法的文档中 它说:

ToString()方法支持50个 精度的小数位。那是, 如果 BigInteger 值大于 50位,仅取最多的50位 有效数字被保留在 输出字符串;所有其他数字 被替换为零。

我有一些代码需要 60 位十进制数字 BigInteger 并将其转换为 string。 60 位有效十进制数字 string 没有丢失任何有效数字:

const string vString = "123456789012345678901234567890123456789012345678901234567890";
Assert.AreEqual(60, vString.Length);
BigInteger v = BigInteger.Parse(vString);
Assert.AreEqual(60, v.ToString().Length);
Assert.AreEqual('9', v.ToString()[58]);
Assert.AreEqual('1', v.ToString()[0]);
Assert.AreEqual(vString, v.ToString());
Assert.AreEqual(vString, v.ToString("G"));

所有断言都通过。

文档中引用的部分到底是什么意思?

I'm using .NET 4 System.Numerics.BigInteger Structure and I'm getting results different from the documentation.

In the documentation of BigInteger.ToString() Method It says:

The ToString() method supports 50
decimal digits of precision. That is,
if the BigInteger value has more than
50 digits, only the 50 most
significant digits are preserved in
the output string; all other digits
are replaced with zeros.

I have some code that takes a 60 decimal digits BigInteger and converts it to a string. The 60 significant decimal digits string didn't lose any significant digits:

const string vString = "123456789012345678901234567890123456789012345678901234567890";
Assert.AreEqual(60, vString.Length);
BigInteger v = BigInteger.Parse(vString);
Assert.AreEqual(60, v.ToString().Length);
Assert.AreEqual('9', v.ToString()[58]);
Assert.AreEqual('1', v.ToString()[0]);
Assert.AreEqual(vString, v.ToString());
Assert.AreEqual(vString, v.ToString("G"));

All the asserts pass.

What exactly does the quoted part of the documentation mean?

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

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

发布评论

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

评论(1

噩梦成真你也成魔 2024-09-12 00:38:59

这里的文档有点不清楚,这个限制仅在格式化字符串时适用,例如:

v.ToString("0"); "123456789012345678901234567890123456789012345678900000000000"
v.ToString("n0"); "123,456,789,012,345,678,901,234,567,890,123,456,789,012,345,678,900,000,000,000"

例外情况是将其格式化为 "R",这给出了原始的往返值:

v.ToString("R"); "123456789012345678901234567890123456789012345678901234567891"

The documentation is a little unclear here, this limit only applies when formatting the string, for example:

v.ToString("0"); "123456789012345678901234567890123456789012345678900000000000"
v.ToString("n0"); "123,456,789,012,345,678,901,234,567,890,123,456,789,012,345,678,900,000,000,000"

The exception is formatting it as "R", which gives the original round-tripped value:

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