我有一个 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 ?
蒂亚!!
看来你的问题可以分成两部分
如果这是真正的问题,那么答案就是使用格式说明符。根据提供的文档,
将格式化数据写入 CStringT,其方式与 sprintf_s 将数据格式化为 C 风格字符数组的方式相同。
因此,为了格式化字符串,您可以仅使用格式说明符。在你的情况下,类似于 %.8f
.Format(_T("%f"), m_Double)
这里@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”。