在我的系统上,以下代码打印'3.6':
double a = 1.2;
int b = 3;
double c = a * b;
Console.WriteLine(c);
但是在调试器中,我可以看到c
的值超过2位数:
我知道我可以用Console.WriteLine("{0:R}", c)
显示完整的表示。这是显示double
的实际值的唯一且推荐的方法吗?
更新
按照上面的示例,我想打印c
,这样如果用户要使用==
获取打印值并将其插回到测试代码中,则比较是真的。在这种情况下,c == 3.5999999999999996
返回true。
答案 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转换为字符串:
我认为这是转换它最便宜的方式。
我找到了它: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);