打印双倍值

时间:2012-12-29 00:41:23

标签: c#

在我的系统上,以下代码打印'3.6':

double a = 1.2;
int b = 3;

double c = a * b;

Console.WriteLine(c);

但是在调试器中,我可以看到c的值超过2位数:

enter image description here

我知道我可以用Console.WriteLine("{0:R}", c)显示完整的表示。这是显示double的实际值的唯一且推荐的方法吗?


更新

按照上面的示例,我想打印c,这样如果用户要使用==获取打印值并将其​​插回到测试代码中,则比较是真的。在这种情况下,c == 3.5999999999999996返回true。

4 个答案:

答案 0 :(得分:8)

3.999999999999996也不是双倍的实际值;这只是十五个地方或其他任何地方的价值。没有内置方法来显示double表示的实际精确值。这实在太糟糕了,因为每个普通的double都可以完全表示为十进制字符串,能够看到它会很好。

作为一项公共服务,我已经为我的博客上的设备提供了源代码:

http://ericlippert.com/2011/02/17/looking-inside-a-double/

请注意,它使用Microsoft Solver Foundation中的Rational类。如果你没有,那么你可以免费下载它,或者编写你自己的Rational类;它是这样做的特征。

如果内部的双打工作主题让您感兴趣,请考虑查看解释所有内容的方便文章的存档。它在:

http://blogs.msdn.com/b/ericlippert/archive/tags/floating+point+arithmetic/

从底部开始;那些是按时间倒序排列的。

答案 1 :(得分:6)

Console.WriteLine使用"G" format specifier调用Double.ToString。这使用当前文化来确定小数位数(“en-US”为1)。

如果要显示8个小数位,可以使用numeric format specifier

Console.WriteLine(c.ToString("N8"));

Standard Numeric Format Strings

编辑:调试器使用此方法将double转换为字符串:

_ecvt_s

我认为这是转换它最便宜的方式。

我找到了它:How does Visual Studio display a System.Double during debugging?

答案 2 :(得分:4)

你也可以使用不同的方法,例如,如果你想要返回2个小数位,你可以尝试这样的东西

double a = 1.2;
int b = 3;
double c = a * b;
var s = string.Format("{0:0.00}", c);
Console.WriteLine(s);
  

输出= 3.60

如果你想抑制最后一个0,你可以做出输出

var s = string.Format("{0:0.##}", c);
  

输出= 3.6随意玩它

答案 3 :(得分:1)

double a = 1.2;
int b = 3;

double c = a * b;
string formatted = c.ToString("N5");
Console.WriteLine(formatted);