C# 为什么VisualStudio调试器显示错误的值,如何更正?

C# 为什么VisualStudio调试器显示错误的值,如何更正?,c#,visual-studio,C#,Visual Studio,我有一个简单的程序,它在VisualStudio调试器中给了我奇怪的结果 Console.WriteLine(“4280.159d*1000000={0}”,4280.159d*1000000); 双D=4280.159d*1000000; WriteLine(“D={0}”,D); WriteLine(“在这里放置一个断点,并在调试器中查看D的值”); 这将打印出以下内容: 4280.159d * 1000000 = 4280159000 D = 4280159000 此输出是正确的,但如

我有一个简单的程序,它在VisualStudio调试器中给了我奇怪的结果

Console.WriteLine(“4280.159d*1000000={0}”,4280.159d*1000000);
双D=4280.159d*1000000;
WriteLine(“D={0}”,D);
WriteLine(“在这里放置一个断点,并在调试器中查看D的值”);
这将打印出以下内容:

4280.159d * 1000000 = 4280159000
D = 4280159000
此输出是正确的,但如果在调试器中查看,D的值显示为4280158999.999995

如果在即时窗口中键入相同的方程式,则会得到相同的错误答案

获得正确答案的唯一方法是在调试器中强制转换为十进制

(decimal)4280.159d * 1000000
4280159000
在VS2010和VS2012中的行为是相同的,它是64位还是32位似乎并不重要。
为什么调试器会给出与正在运行的代码不同的结果,并且有办法修复它?

调试器会显示正确的值。
WriteLine
调用将小数点四舍五入,并将其转换为字符串,以便显示。

调试器显示正确的值。
WriteLine
调用正在对小数点进行四舍五入,并将其转换为字符串以便显示。

调试器是正确的。输出值会导致舍入。欢迎来到浮点的奇妙世界。使用
decimal
。欢迎使用浮点数。4280.159没有IEEE浮点数的完美表示。@evanmcdonnal:没有。他在数字后面加上
d
(例如4280.159d)来使用双文本调试器是正确的。输出值会导致舍入。欢迎来到浮点的奇妙世界。使用
decimal
。欢迎使用浮点数。4280.159没有IEEE浮点数的完美表示。@evanmcdonnal:没有。他使用双字面值,在数字后面加上
d
(例如4280.159d)。我很确定WriteLine没有四舍五入。如果将If改为读Console.WriteLine(“D={0:0.\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\;它仍然读取4280159000。@RonnBlack进行舍入的是对字符串的隐式转换,
WriteLine
中的赋值导致了这种情况。我很确定WriteLine没有舍入。如果将If改为读Console.WriteLine(“D={0:0.\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\;它仍然读取4280159000。@RonnBlack执行舍入的是隐式转换到字符串,
WriteLine
中的赋值导致了这种情况的发生。