示例程序。只需打印转换后的值。
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
char buffer[256] = "";
sprintf_s(buffer, "%.2e", -20.12345);
cout << buffer << endl;;
return 0;
}
在Visual Studio 2010和Visual Studio 2015中运行相同的程序。
他们显示不同的输出。
Visual Studio 2010输出:
-2.01e+001
Visual Studio 2015输出:
-2.01e+01
为什么显示不同的输出? 任何人都可以解释。
由于
答案 0 :(得分:2)
<m>E<n>
形式的科学记数法表示m * 10 n ,其中m
和n
可以是正数或负数。这意味着-2.01e+001
和-2.01e+01
实际上是相同的数字(-2.01 * 10 1 )。但是,使用e
格式说明符时,实际上可以输出具有非常大或非常小的 e 值的数字,例如,您可以输出2e150
。 3位指数用于填充输出字符串并使其更均匀(考虑2e99, 2e101
vs 2e099, 2e101
)。
也可以使用_set_output_format函数来更改将显示的位数。值得注意的是,在该文档页面上也说明了
默认情况下,Visual C ++标准C库中的printf,wprintf和相关函数等函数的浮点数输出会为指数打印三位数,即使不需要三位数来表示该值也是如此。指数。零用于将值填充为三位数。
答案 1 :(得分:0)
如Chux在How to control the number of exponent digits after 'e' in C printf %e?中所指出的,合规行为是指数的两位数,除非需要更多。在VS-2015之前,VS不合规。显然提供了_set_output_format以允许合规行为。
由于在VS-2015中删除了_set_output_format - 并且行为已更改为两位指数 - 必须假设VS正在尝试更加合规。
我发现这是因为我需要在我的应用程序中使用兼容行为: - (