C# 将 20 位精度双精度转换为字符串并再次返回
Posted
技术标签:
【中文标题】C# 将 20 位精度双精度转换为字符串并再次返回【英文标题】:C# Converting 20 digit precision double to string and back again 【发布时间】:2009-03-04 17:09:49 【问题描述】:在 C# 中。我有一个具有 20 位精度的双精度数(我从数据库中提取的)。在 Visual Studio(使用 QuickWatch)中,我可以看到双精度值 = 0.00034101243963859839。
我想在文本框中显示这个值,然后当我把它拿出来并将它转换回双精度值时让它成为相同的值。但我总是输掉最后两位数
我尝试了以下方法:
double d = 0.00034101243963859839;
string s = d.ToString();
string s2 = d.ToString("F20");
string s3 = d.ToString("0.00000000000000000000"); -- 20 0's
string s4 = (d*100d).ToString();
在这些情况下:
s = 0.000341012439638598 s2 = 0.00034101243963859800 s3 = 0.00034101243963859800 s4 = 0.0341012439638598
我希望能够做到以下几点:
double d = 0.00034101243963859839;
string s = d.ToString();
//...
double d2 = double.Parse(s);
if(d == d2)
//-- Success
有没有办法保持最后两位的精度??
【问题讨论】:
【参考方案1】:使用“R”numeric format string:
double d = 0.00034101243963859839;
string s = d.ToString("R");
//...
double d2 = double.Parse(s);
if(d == d2)
//-- Success
R
代表“往返”。来自链接的文档:
仅 Single 和 Double 类型支持此格式。往返说明符保证转换为字符串的数值将被解析回相同的数值。
顺便说一句,我怀疑没有办法保留最后两位数。只有这么多的精度可用,我怀疑他们是否会首先进入d
。但是你可以确保你的字符串至少能正确读回你所拥有的。
如果您确实需要额外的精度,您可以尝试使用decimal
。
【讨论】:
“顺便说一句,我怀疑没有办法保留最后两位数。” - 但是 Visual Studio 如何“看到”这两个数字? 仅供参考,但在深入查看链接的文章时,它说“对于 Double 和 Single 值,在某些情况下,“R”格式说明符无法成功往返原始值,并且提供相对较差的性能。相反,我们建议您对 Double 值使用“G17”格式说明符,并使用“G9”格式说明符来成功往返 Single 值。”【参考方案2】:没有。除了 double 是二进制的,因此不适合十进制值这一事实之外, 双精度数最多有 15/16 个十进制数字(53 位)。 十进制最多有 28/29 位(96 位),所以可以使用它。 如果您在数据库中具有更高的精度,则需要一个自己的 C# bignum 类,请查看 *** 的实现。
【讨论】:
以上是关于C# 将 20 位精度双精度转换为字符串并再次返回的主要内容,如果未能解决你的问题,请参考以下文章
是否有一种定义明确且高性能的方式将双精度位转换为 uint64_t 并返回