31

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

有没有办法保持最后两位精度?

4

2 回答 2

57

使用“R”数字格式字符串

double d = 0.00034101243963859839;
string s = d.ToString("R");
//...
double d2 = double.Parse(s);
if(d == d2)
{
  //-- Success
}

代表“R往返”。从链接的文档:

仅 Single 和 Double 类型支持此格式。往返说明符保证转换为字符串的数值将被解析回相同的数值。

顺便说一句,我怀疑没有办法保留最后两位数。只有这么多的精确度可用,我怀疑他们是否会d首先做到这一点。但是您可以确保您的字符串至少可以正确读取您所拥有的内容。

如果您真的需要额外的精度,您可以尝试使用 adecimal代替。

于 2009-03-04T17:12:56.917 回答
1

不可以。除了 double 是二进制的,因此不适合十进制值之外,double 最多有 15/16 个十进制数字(53 位)。十进制最多有 28/29 位(96 位),所以可以使用它。如果您在数据库中具有更高的精度,则需要一个自己的 C# bignum 类,请查看 stackoverflow 的实现。

于 2009-12-07T23:52:01.213 回答