【问题标题】:Elegant solution to remove trailing 0's with precision set通过精确设置删除尾随 0 的优雅解决方案
【发布时间】:2017-12-04 20:16:53
【问题描述】:

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

  1. 科学记数法被禁用
  2. 小数部分的精度为 6
  3. 但是,尾随 0(用于小数部分)不会打印出来

例如:

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

应该准确地打印出200000779998[something] 应该是 noexcept 一些现有操纵器的组合。

不是解决问题的方法:

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

因为它会打印出200000779998.000000,并带有尾随0

【问题讨论】:

  • 如果小数部分非零,即非整数,您是否希望打印出来?即 12345.67
  • 我解决了这个问题
  • @skypjack 否。OP 希望将3.14 打印为3.14,而不是3.140000。 OP 希望最多支持 6 位小数,这样3.14159265 将打印为3.141592(可能是四舍五入,对我的解释不重要),3.1451 将打印为3.1451
  • @贾斯汀你是对的。只需重新阅读问题。我的错。 ;-)
  • @MoonMoo 是的,如果为 0(给定精度),则不应该看到小数部分

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


【解决方案1】:

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

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

You can try it here.

【讨论】:

    【解决方案2】:

    很难证明是否定的,但我认为不会。

    要求与任何正常使用不符。空间效率决定了二进制格式。 6 位数(十进制)的精度表明一种格式适用于无法翻阅大量数据的人类读者。并且人类在处理一致的 6 位格式时没有问题。

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

    【讨论】:

    • 我会说与当前的做法不一致。但是,删除不必要的零绝对是一个明智的想法(甚至,忽略没有实际意义的小数位(因为精度较低)是一个明智的想法。)
    • 不同意。我实际上认为 OP 要求的格式(将 6 推广到任何合适的 N)可能对人类来说是最方便的。它既节省空间(考虑到屏幕空间,而不是内存空间)又具有可读性。比较 [1, 2, 3.08, 5.0869] 和 [1.000000, 2.000000, 3.080000, 5.086900]
    猜你喜欢
    • 2018-04-28
    • 1970-01-01
    • 2011-03-31
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2012-12-20
    相关资源
    最近更新 更多