我正在检查一段代码。一切都是正确的,但我无法理解的概念。
double a = 0.001;
double b = 0.001;
double c = a * b;
printf ("%lf", c);
在visual c ++中进行调试时,我在第3行之后将鼠标指向c时显示9.999999999999995e-007,但在打印时显示正确的结果,即0.000001。我想知道它在调试工具提示中显示的值以及它如何表示和转换。
答案 0 :(得分:3)
这是printf执行舍入的结果。
printf格式%lf舍入为默认精度。从我的头脑中,我认为默认值为6,这就是为什么你得到0.000001。
调试器显示double的实际内容。由于浮点运算的性质,0.001 * 0.001的结果实际上不是0.000001,而是近似值,但差异非常小。
通过使用其他格式,您可以看到差异。例如。尝试printf(“%。15e”,c);
答案 1 :(得分:0)
从double / float到字符串的转换有不同的实现,并且基于它会得到不同的结果。我知道的mos准确实现是std::sringstream
,我知道至少在IOS设备上与printf
不同。
据我所知,visual studio界面是用C#编码的,所以你可能想看看C#如何将双精度转换为字符串以获得你想要的答案。
勒兹。