6

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

double a = 1.2;
int b = 3;

double c = a * b;

Console.WriteLine(c);

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

在此处输入图像描述

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


更新

使用上面的示例,我想打印c这样,如果用户要使用打印的值并将其插入到测试中的代码中==,那么比较将是正确的。在这种情况下c == 3.5999999999999996返回 true。

4

4 回答 4

8

3.999999999999996 也不是双精度的实际值;这只是四舍五入到十五位或其他值的值。没有内置方法可以显示双精度表示的实际确切值。这真的太糟糕了,因为每个普通的双精度都可以精确地表示为一个十进制字符串,如果能够看到这一点会很高兴。

作为一项公共服务,我在我的博客上放了一个设备的源代码:

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/

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

于 2012-12-29T04:34:15.200 回答
8

Console.WriteLineDouble.ToString使用“G”格式说明符的调用。这使用当前区域性来确定小数位数(1 表示“en-US”)。

如果要显示 8 位小数,可以使用数字格式说明符

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

标准数字格式字符串

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

_ecvt_s

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

我在哪里找到它:Visual Studio 如何在调试期间显示 System.Double?

于 2012-12-29T00:50:12.703 回答
5

您也可以使用不同的方法,例如,如果您想返回 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

如果你想抑制输出为 3.6 的最后一个 0,你可以这样做

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

输出 = 3.6 随意玩弄它

于 2012-12-29T01:01:16.837 回答
1
double a = 1.2;
int b = 3;

double c = a * b;
string formatted = c.ToString("N5");
Console.WriteLine(formatted);
于 2012-12-29T00:45:47.230 回答