C、科学计数法、格式号

新手上路,请多包涵

是否可以通过以下方式以科学计数法格式化字符串:

  • 在指数中设置固定位置:1

  • 在尾数中设置固定小数位:0

    double number = 123456.789

所以数字应该被格式化

  1e+5

我无法为尾数设置 0 个小数点:

 cout.precision(0);
cout << scientific << number;

结果:

 1.234568e+005

原文由 abcdef 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 703
2 个回答

我不确定您使用的是哪个 C++ 编译器,它会为您提供 3 位指数——C 和 C++ 标准至少需要 2 位数字,这就是 g++ 所做的。使用标准 C 或 C++ I/O 函数无法只获得一位数,因此您必须推出自己的解决方案。由于进行浮点到字符串的转换是 一个非常棘手的问题[PDF],我强烈建议不要这样做,而是对结果进行后处理。

这是一种方法:

 // C version; you can rewrite this to use std::string in C++ if you want
void my_print_scientific(char *dest, size_t size, double value)
{
    // First print out using scientific notation with 0 mantissa digits
    snprintf(dest, size, "%.0e", value);

    // Find the exponent and skip the "e" and the sign
    char *exponent = strchr(dest, 'e') + 2;

    // If we have an exponent starting with 0, drop it
    if(exponent != NULL && exponent[0] == '0')
    {
        exponent[0] = exponent[1];
        exponent[1] = '\0';
    }
}

原文由 Adam Rosenfield 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以使用 {fmt} 格式化库 轻松做到这一点:

 #include <fmt/core.h>

double number = 123456.789;
auto s = fmt::format("{:.0e}\n", number); // s == "1e+05"
s.erase(s.size() - 2, 1); // s == "1e+5"

基于此库的格式化工具被提议用于 C++20 中的标准化: P0645

免责声明:我是 {fmt} 的作者。

原文由 vitaut 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题