【问题标题】:Display double in immediate window different in vs2013/vs2017在 vs2013/vs2017 中不同的即时窗口中显示双倍
【发布时间】:2019-03-08 19:03:35
【问题描述】:

我有以下代码行:

double r = 0.000056262413896897934;

在 Visual Studio 2013 中,我转到直接窗口并输入:

?r

结果显示双精度值:

0.000056262413896897934

但是,如果我在 Visual Studio 2017 中调出项目并在即时窗口中键入:

?r

显示如下结果(指数格式):

5.6262413896897934E-05

我希望 Visual Studio 2017 以与 Visual Studio 2013 相同的方式显示格式:

0.000056262413896897934

不仅适用于这个变量或这个解决方案,而且作为一个永久设置。有谁知道如何做到这一点?提前致谢

【问题讨论】:

  • 在程序集级别的 DebuggerDisplay 属性,也许。不是永久设置,而是半永久设置。
  • 工具 > 选项 > 调试 > 常规,勾选“使用旧版 C# 和 VB 表达式处理程序”复选框。它是永久性的,但消息框确实提醒您,今天习惯这个小怪癖比明天容易。
  • 最好不要使用旧的 C# 和 VB 表达式处理程序。虽然改变可能会改变这种行为,但它会产生更广泛的影响。虽然它并不理想,但下面的解决方法是一个更好的长期解决方案。如果您想更改所有用户的默认设置,请打开关于开发者反馈的问题。 (披露:我在 VS 调试器上工作)
  • 安迪,你在 vs2013 中运行得非常好!为什么默认使用如此棘手的指数格式?乍一看,有人可能会认为它是 5.63……事实上,该值小于 1!对眼睛很不友好,就我的两分钱。

标签: c# visual-studio visual-studio-2017


【解决方案1】:

正如@Amy 提到的,您可以使用DebuggerDisplay 在调试器中更改对象的外观。由于double 是一种内置类型,您不能只更改其实现。对于这样的情况,调试器有一个特性,它可以在外部加载 DebuggerDisplay 实现,这些实现在 autoexp.cs 中实现

  1. 打开(以管理员身份)autoexep.cs 文件,该文件应位于如下目录中: C:\Program Files (x86)\Microsoft Visual Studio\16\Preview\Common7\Packages\Debugger\Visualizers\Original 显然会随着你的 VS 版本而改变,但如果你搜索 autoexp.cs 你会找到它。
  2. 在该文件中,添加以下代码:[assembly: DebuggerDisplay(@"{ToString(""F17""),nq}", Target = typeof(Double))] 这将告诉调试器在显示double 时基本上执行ToString("F17")
  3. 以管理员身份打开开发人员命令提示符并导航到 autoexp.cs 所在的位置,例如C:\Program Files (x86)\Microsoft Visual Studio\16\Preview\Common7\Packages\Debugger\Visualizers\Original
  4. 使用csc /t:library autoexp.cs 构建文件
  5. 重新加载 VS 并运行您的场景

然后您应该会看到如下内容:

有关DebuggerDisplay 的更多信息在我们的文档中:https://docs.microsoft.com/en-us/visualstudio/debugger/using-the-debuggerdisplay-attribute?view=vs-2017,有关DoubleToString 实现的更多信息在:https://docs.microsoft.com/en-us/dotnet/api/system.double.tostring?view=netframework-4.7.2

【讨论】:

  • 安迪,非常感谢您的回复。非常感谢!但非常遗憾的是,指数格式现在是默认格式。为什么默认使用如此棘手的指数格式?乍一看,有人可能会认为它是 5.63……事实上,该值小于 1!对眼睛很不友好,就我的两分钱。
  • 我不认为这是一个困难的情况。 ToString 实现包含一种以任何一种方式(以及许多其他方式)可视化双精度的方法。同样,这里改变的不是 VS,而是 .NET 中的实现改变了 ToString 的实现。您可以在以下位置查看 .NET Core 版本:github.com/dotnet/corefx/blob/…。这只是调用 NumberFormat/NumberToDouble。我不知道什么时候/如果改变了。可能值得在 GitHub 上打开一个问题以了解更多信息。
  • 尽管如此,改变的一个原因可能仅仅是指数和尾数更准确地表示双精度数而不是小数。鉴于底层存储就是这样。
猜你喜欢
  • 1970-01-01
  • 2014-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-24
  • 1970-01-01
  • 2015-08-01
  • 2017-10-17
相关资源
最近更新 更多