vb.net - 如果我在 vb.net 中输入数字,Visual Studio 2012 会将数字添加到我的 double 值中

标签 vb.net visual-studio-2012 double code-formatting

这是一个非常奇怪的行为,可能是 Visual Studio 2012 的有用行为。 当我在 vb.net 中输入 double 值时,例如:

Dim myD as Double = 1.4

当我按下回车键或以另一种方式移动焦点时,格式就会启动并将上面的内容更改为:

Dim myD as Double = 1.39999999999999998

或 1.6 为

Dim myD as Double = 1.6000000000000001

这种行为似乎并不是所有 double 都会发生。 1.3、1.5、1.7 和 1.8 请观看此 YouTube 电影了解实际行为: http://youtu.be/afw4jg58-aU

为什么,更重要的是,我怎样才能防止这种情况发生?

编辑:

安装的扩展有: enter image description here

第二次编辑

这种行为似乎已经消失了。我不知道是什么原因导致了这个问题,所以为了将来的引用,这对任何人来说都是无用的,但现在,我很高兴我不必按照建议进行故障排除。

最佳答案

this question 中也报告了完全相同的问题。这适用于 VS2010,否则没有可用的答案。

这是一个环境问题,代码加载到 Visual Studio 中会与计算机上的 FPU 控制字发生冲突。它是一个处理器寄存器,决定浮点运算如何工作,它看起来像这样:

enter image description here

舍入控制位是一个很好的麻烦来源,它们决定如何将内部 80 位精度浮点值截断为 64 位。选项包括向上舍入、向下舍入和舍入到最接近的值。精度控制位也是一个不错的选择,选项有全 64 位精度、53 和 24 位。

VS2012 和 .NET Framework 都依赖于操作系统默认值,预计以后不会改变。当代码实际上确实改变它时,很难诊断出现的问题,您的观察非常符合该模式。最常见的麻烦制造者是:

  • 编码 uses DirectX没有 D3DCREATE_FPU_PRESERVE 选项。 DirectX 重新编程精度和舍入控制位以挤出更多性能。

  • 用较旧的 Borland 语言产品编写的代码。其运行时库在 non-standard way 中初始化 FPU 控制字。 。否则,依赖于旧运行时库或在更高版本中进行的旧遗留初始化的软件会出现一般问题。

  • 一般来说,任何使用媒体编解码器或媒体 API 的代码。出于与 DirectX 相同的原因,此类代码往往会重新编程 FPU 以挤出性能。在我开发的一个大量使用此类编解码器的产品中尤其臭名昭著。代码库中充满了在调用外部代码后重置 FPU 控制字的调用。

查找并消除此类代码可能非常困难。 DLL 会被各种恶意恶意软件注入(inject)到另一个进程中。 SysInternals 的 Autoruns 实用程序非常有用,它显示了注入(inject)代码的所有可能方式以及禁用它的简单方法。准备好对所看到的内容感到震惊,并立即禁用不带有 Microsoft 版权的内容。

对于动态注入(inject),您需要一个调试器来查看 VS 中加载的内容。再次启动 VS 并使用 Tools + Attach to Process 附加到第一个进程,选择非托管调试器。调试 + Windows + 模块显示加载了哪些 DLL。请注意,DLL 可能是暂时的,像"file"+“打开”+"file"这样的 shell 对话框会将 shell 扩展动态加载到 VS 中,然后再次卸载它们。祝你好运,你会需要它,有时唯一的解决方法是相当彻底的解决方法。

关于vb.net - 如果我在 vb.net 中输入数字,Visual Studio 2012 会将数字添加到我的 double 值中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22203184/

相关文章:

.net - 如何初始化单例?

vb.net - 移动目录中的文件夹

c++ - 在 VS2012 中使用 sqrt 内在的堆栈运行时检查失败

.net - 无法加载文件或程序集 不支持操作。 (来自 HRESULT : 0x80131515) 的异常

c++ - 如何在 C++ 中将字符串转换为具有 6 位精度的 double ?

.net - 在 vb.net 应用程序中打开图像后无法删除图像

vb.net - VB.net 的 EnableCors

visual-studio - 从 Microsoft 测试管理器中的探索性 session 创建测试用例仅显示最后 10 个步骤

java - double 和 float 据类型的行为

c - C中的奇怪舍入