MFC DDX_Text() 双输入 - CString %f 输出不同?

问题描述 投票:0回答:1

我有一个 MFC 应用程序在双精度值上使用

DDX_Text()
。我输入
.0000001
作为值,当我返回时,它是
1e-07
(大概使用 %g),如果我以这种方式保存它,它会保持
1e-07

现在,如果我取

CString
.Format(_T("%f"), m_Double)
,输出为
0.000000
(缺少 1)。将鼠标光标悬停在调试模式上时报告的 m_Double 的实际值是:
9.9999999999999995e-08

使用 Visual Studio 2022(使用 Visual Studio 2019 目标的解决方案)。

如何使输出为 .0000001 ?

蒂亚!!

c++ mfc visual-studio-2019
1个回答
0
投票

看来你的问题可以分成两部分

  1. 显示6位以上

如果这是真正的问题,那么答案就是使用格式说明符。根据提供的文档

将格式化数据写入 CStringT,其方式与 sprintf_s 将数据格式化为 C 风格字符数组的方式相同。

因此,为了格式化字符串,您可以仅使用格式说明符。在你的情况下,类似于 %.8f

.Format(_T("%f"), m_Double)
  1. 问题的第二部分是关于 IEEE 浮点的准确性。

这里@iinspectable 非常正确,因为它们无法准确表示。

但是,您可以通过发生的舍入来帮助

从 Windows 10 版本 2004(内部版本 19041)开始,printf 系列函数根据 IEEE 754 舍入规则打印可精确表示的浮点数。在以前版本的 Windows 中,以“5”结尾的精确可表示的浮点数始终会向上舍入。 IEEE 754 规定它们必须四舍五入到最接近的偶数(也称为“银行家四舍五入”)。例如, printf("%1.0f", 1.5) 和 printf("%1.0f", 2.5) 都应舍入为 2。以前,1.5 将舍入为 2,2.5 将舍入为 3。此更改仅影响精确可表示的数字。例如,2.35(在内存中表示时更接近 2.35000000000000008)继续向上舍入为 2.4。这些函数完成的舍入现在也遵循 fesetround 设置的浮点舍入模式。以前,舍入总是选择 FE_TONEAREST 行为。此更改仅影响使用 Visual Studio 2019 版本 16.2 及更高版本构建的程序。要使用旧版浮点舍入行为,请链接到“legacy_stdio_float_rounding.obj”。

© www.soinside.com 2019 - 2024. All rights reserved.