【问题标题】:Format changes in Visual Studio 2015Visual Studio 2015 中的格式更改
【发布时间】:2017-01-25 06:11:44
【问题描述】:

示例程序。只需打印转换后的值。

#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

为什么显示不同的输出? 任何人都可以解释。

谢谢

【问题讨论】:

    标签: c++ visual-studio-2010 visual-studio-2015 printf


    【解决方案1】:

    &lt;m&gt;E&lt;n&gt;形式的科学记数法表示m*10n,其中mn都可以是正数或负数。这意味着-2.01e+001-2.01e+01 实际上是同一个数字(-2.01*101)。但是,当使用e 格式说明符时,您实际上可以输出具有非常大或非常小的e 值的数字,例如您可以输出2e150。 3 位指数用于填充输出字符串并使它们更加统一(考虑 2e99, 2e1012e099, 2e101)。

    也可以使用_set_output_format 函数来更改将显示的位数。值得注意的是,在该文档页面上还声明了

    默认情况下,由 printf、wprintf 等函数以及 Visual C++ 标准 C 库中的相关函数输出的浮点数会打印三位数字作为指数,即使不需要三位数字来表示指数。零用于将值填充为三位数。

    【讨论】:

    • 我可以删除多余的填充零吗?如果是,那怎么办?我已将我的项目从 VS 2010 转换为 VS 2015。VS 2015 给我这样的编译错误“格式失败:预期 -2.01e+01 但为 -2.01e+001”
    • @VijayKumbhani,请仔细阅读答案,我已经提到过:It is also possible to use _set_output_format function to change the amount of digits that will be shown.
    • _set_output_format 实际上已经不存在了,从VS2015开始
    【解决方案2】:

    正如 Chux 在How to control the number of exponent digits after 'e' in C printf %e? 中指出的那样,除非需要更多,否则合规行为是使用两位数作为指数。在 VS-2015 之前,VS 是不合规的。显然,提供了 _set_output_format 以允许合规行为。

    由于 _set_output_format 在 VS-2015 中被删除 - 并且行为被更改为两位数的指数 - 人们必须假设 VS 正在尝试更加兼容。

    我发现这个是因为我需要在我的应用程序中使用合规行为 :-(

    【讨论】:

    • 我需要不合规行为与旧的不合规格式兼容。既然 MS 决定兼容并删除了 _set_output_format,这已成为不可能(无需编写您自己的 fprint 变体或返回到较旧的 Visual Studio 版本)。微软处于最佳状态!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-26
    • 2015-05-29
    相关资源
    最近更新 更多