C#将20位精度双精度转换为字符串并再次返回
在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以获取实现。