C# 打印双值

C# 打印双值,c#,C#,在我的系统上,以下代码打印“3.6”: double a = 1.2; int b = 3; double c = a * b; Console.WriteLine(c); 但在调试器中,我可以看到c的值超过2位: 我知道我可以使用Console.WriteLine(“{0:R}”,c)显示完整的表示。这是显示双精度实际值的唯一推荐方法吗 更新 在上面的例子中,我希望打印c,这样,如果用户在测试中使用=将打印的值插入到代码中,那么比较将是正确的。在这种情况下,c==3.59999999

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

double a = 1.2;
int b = 3;

double c = a * b;

Console.WriteLine(c);
但在调试器中,我可以看到
c
的值超过2位:

我知道我可以使用
Console.WriteLine(“{0:R}”,c)
显示完整的表示。这是显示双精度<代码>实际值的唯一推荐方法吗


更新


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

控制台。WriteLine
调用使用。这将使用当前区域性来确定小数位数(1表示“en-US”)

double a = 1.2;
int b = 3;

double c = a * b;
string formatted = c.ToString("N5");
Console.WriteLine(formatted);
如果要显示8位小数,可以使用:

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

我想这是最便宜的转换方式


在我找到它的地方:

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


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

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

注意,它使用微软Salver基金会的Rational类。如果你没有,那么你可以免费下载,或者编写你自己的Rational类;这样做是性格塑造

如果双倍工作的主题在内部引起你的兴趣,考虑看看我手边的文章,解释这些。位于:


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

如何显示取决于您想用它做什么。您想显示多少小数位?请注意其他回答者:真正的问题是比较双精度,而不是格式化输出。我建议@dharmatech更新他们的问题。嗨,Tim。我想显示调试器中显示的值。使用“N8”甚至“N20”都不会显示该值。@dharmatech:编辑了我的答案。为什么要将其显示为与调试器相同的值?我希望显示该值,这样,如果该值随后被获取并与
==
一起使用,则测试将为真。例如,在这种情况下,
c==3.599999999996
确实返回true。@dharmatech:您将进入危险区域。读这个:有趣的是,你提到了滚动你自己的
Rational
类。这个问题产生于我的项目有它自己的理由。最终,拥有C#版本的将是一件好事。如果将来主流语言有这样一个完整的数字塔,那就太好了。有人问我,我用我的实际目标更新了这个问题。###不会同时抑制两个零吗?它应该是:'var s=string.Format(“{0:0.0#}”,c);'
var s = string.Format("{0:0.##}", c);