C# 在.NET中,BigInteger.ToString()返回的字符串是否反映了BigInteger的完整精度?

C# 在.NET中,BigInteger.ToString()返回的字符串是否反映了BigInteger的完整精度?,c#,.net,biginteger,C#,.net,Biginteger,直到今天,我(隐式地)假设,当我通过无参数(重写)实例方法biginger.ToString()输出一个biginger时,返回字符串将包含我的“大”整数的完整精确十进制表示 但是,我读到: “在大多数情况下,ToString方法支持50位小数精度。也就是说,如果BigInteger值超过50位,则输出字符串中只保留50位最重要的数字;所有其他数字都替换为零。但是,BigInteger支持”R“标准格式说明符,用于往返数值。ToString(string)方法使用“R”格式字符串返回的字符串保留

直到今天,我(隐式地)假设,当我通过无参数(重写)实例方法
biginger.ToString()
输出一个
biginger
时,返回字符串将包含我的“大”整数的完整精确十进制表示

但是,我读到:

“在大多数情况下,ToString方法支持50位小数精度。也就是说,如果BigInteger值超过50位,则输出字符串中只保留50位最重要的数字;所有其他数字都替换为零。但是,BigInteger支持”R“标准格式说明符,用于往返数值。ToString(string)方法使用“R”格式字符串返回的字符串保留整个BigInteger值,然后可以使用ParseTryParse方法进行解析,以恢复其原始值,而不会丢失任何数据”_

然而,我还没有找到一个例子,说明
myBigInt.ToString()
myBigInt.ToString(“R”)
有什么不同。正如我所说,上面页面中的备注示例没有在我的框架版本(.NET 4.0 SP1)中提供一个例子。(还有
“G”
“R“
似乎等同于
biginger

可以安全地假设无参数的
ToString()
给出整数的完整十进制扩展吗?
它们是否改变了框架行为,或者上述示例代码是否总是错误的

注意:在我写了这篇文章之后,我看到了这一点,但我仍在提交我的问题,因为2984184的答案并不清楚零参数
ToString()
是如何工作的

自己编辑:


当我的问题(主要)是关于
ToString()
重载时,我在MSDN上链接
ToString(String)
重载有点不连贯。因此,请参阅其中也提到了50位数的限制,但没有提供超过50位数的示例。

我认为这不是一个安全的假设


因为他们明确地记录了它没有这样做,所以依赖这种行为似乎是个坏主意。如果它实际上是相同的,那么它就没有文档记录,理论上可能随时发生变化(尽管这似乎不太可能)。

反编译.NET 4.0 framework会产生以下调用链:

BigInteger.ToString
BigNumber.FormatBigInteger( ... format:= null ...)
BigNumber.ParseFormatSpecifier(format ...)
我们有

  if (string.IsNullOrEmpty(format))
    return 'R';

因此可以看出,在这个实现中,
ToString()
相当于
ToString(“R”)
。但是,考虑到文档(有点混乱)明确否认了这一点的可靠性,我想说,最安全(而且在任何情况下都是最自我记录)的做法是在需要完全保真度时使用“R”

查看源代码
ToString()
方法只调用:

BigNumber.FormatBigInteger(此,(字符串)null,NumberFormatInfo.CurrentInfo)

从这里开始,内部
BigNumber.FormatBigInteger(BigInteger值、字符串格式、NumberFormatInfo信息)
方法具有以下逻辑:

int digits = 0;
char format1 = BigNumber.ParseFormatSpecifier(format, out digits);
因此,现在我们来看一下
BigNumber.ParseFormatSpecifier(字符串格式,out int digits)
方法,发现因为它传入了一个空字符串,所以它只返回一个数字(
digits
)等于-1的字符“R”。然而,如果您实际以字符串格式传递,您也可以指定位数,例如…'R25'将解析出25作为位数


这就是我通过查看源代码所理解的。

“因此可以看出,在这个实现中,ToString()相当于ToString(“R”)”——值得一提的是:这并没有否定文档中承诺的ToString()相当于ToString(“G”):如果ToString(“G”)和ToString(“R”),这仍然是正确的net 3.5有自己的ToString实现。因此,这可能是.NET4.0的新功能。事实上,3.5中甚至没有BigNumber类。Nevermind-BigNumber在3.5中不是公共的(它是内部的)。我想知道这是否是早期内部实现的一个文档泄漏。@hatchet我认为
BigNumber
只是一个内部助手类。我想我明白了文件的意图;这并不像可能的那么清晰。关于未来的框架版本可能会改变
ToString()
的行为的可能性:谁会希望任意精度类型的“默认”可视化有一堆数字“替换为零”(如文档所说)?这就像说“这种类型在内部具有任意精度,但我们将其作为一个固定精度(50位)数字呈现给用户”。在我看来,这太傻了。如果数字的开头少于25个数字,那么看起来像是“R25”
在数字前面加了零。例如,当数字有1000个数字时,它看起来像
“R”
“R25”
产生相同的输出,并且没有添加零,在这种情况下,没有数字被零替换。在任何情况下,文档都是错误的(请注意当前的实现),而
ToString(字符串)页面上“备注”部分的示例
重载不会产生他们声称的输出:
“G”
格式不会丢失任何信息(在他们自己的示例中)。