在C#中。我有一个具有20位精度的双精度(我从数据库中提取)。在Visual Studio中(使用QuickWatch)我可以看到double的值为= 0.00034101243963859839。

我希望在文本框中显示此值,然后在我取出它并将其转换回double时使其具有相同的值。但我总是输掉最后两位数

我尝试了以下内容:

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
}

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

有帮助吗?

解决方案

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

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

R 代表“往返”。来自链接文档:

  

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

顺便说一句,我怀疑没有办法保留最后两位数字。只有那么多精度可用,我怀疑它们首先进入 d 。但是你可以确保你的字符串至少回读你正确的内容。

如果您确实需要额外的精度,可以尝试使用 decimal

其他提示

没有。除了double是二进制的,因此对十进制值不好, 双打最多15/16位十进制数(53位)。 十进制最多有28/29位(96位),因此可以使用它。 如果您在数据库中具有更高的精度,则需要为C#提供自己的bignum类,请查看stackoverflow中的实现。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top