优雅的解决方案,以精确设置删除尾随0

时间:2017-12-04 20:16:54

标签: c++ boost c++14 std

是否有任何优雅的解决方案使用std C ++或Boost库以满足以下条件的方式输出doublestd::cout

  1. 科学记数法已停用
  2. 小数部分的精度为6
  3. 但是,结尾0(小数部分)不会打印出来
  4. 例如:

    double d = 200000779998;
    std::cout << `[something]` << d;
    

    应准确打印200000779998[something]应该是某些现有操纵者的noexcept组合。

    这是 解决问题的方法:

    std::cout << std::setprecision(6) << std::fixed << d;
    

    因为它打印出200000779998.000000,后跟0

2 个答案:

答案 0 :(得分:1)

您可以尝试使用(滥用?)fixed,而不是使用defaultfloat操纵器。据我所知,它根据将数字置于指定精度范围内的能力选择固定或科学。因此,您可以将精度设置为整数部分的位数+所需的分数精度(在您的情况下为6)。

double d = 200000779998;
std::cout << std::setprecision(integralDigits(d) + 6) << d << std::endl;

You can try it here.

答案 1 :(得分:0)

很难证明是消极的,但我会假设没有。

要求与任何正常使用不一致。空间效率决定了二进制格式。 6位数(十进制)的精确度表明了一种针对人类读者的格式,他们无法通过大量数据流失。人类处理一致的6位数格式没有问题。

所以,你基本上是针对一个没有明显受众的格式,这就是为什么如果有支持的话我会感到惊讶。