【问题标题】:c++ print number in hexadecimal right after floor functionc++ 在 floor 函数之后以十六进制打印数字
【发布时间】:2020-02-22 06:31:29
【问题描述】:

我注意到 c++ 中有一些我不理解的奇怪行为, 我正在尝试以十六进制表示形式打印截断的双精度

此代码输出为17,它是十进制表示

double a = 17.123;
cout << hex << floor(a) << '\n';

虽然此代码输出为 11 也是我的理想输出

double a = 17.123;
long long aASll = floor(a);
cout << hex << aASll << '\n';

由于 double 可以得到非常大的数字,我担心将截断的数字存储在 long long 变量中时输出错误,有什么建议或改进吗?

【问题讨论】:

    标签: c++ hex cout floor


    【解决方案1】:

    Quoting CPPreference's documentation page for std::hex (and friends)

    修改整数 I/O 的默认数字基数。

    这表明std::hex 对浮点输入没有任何影响。你会得到最好的是

    cout << hex << static_cast<long long>(floor(a)) << '\n';
    

    或具有相同功能的函数。

    如果值始终为正,来自&lt;cstdint&gt;uintmax_t 可能有助于获取最大的可用整数。毕竟,负十六进制数是什么?

    由于double 值很容易超过可用整数的最大分辨率,因此这不会覆盖整个范围。如果下限值超过了整数类型可以容纳的值,您将不得不手动进行转换或使用大型整数库。

    旁注:std::hexfloat 确实是 something very different,并且由于某些 poor wording in the current Standard 已经被敲定,因此在所有编译器中都不能正常工作,应该在下一个版本中更正。

    【讨论】:

      【解决方案2】:

      只需编写您自己的 floor 版本并让它返回一个整数值。例如:

      long long floorAsLongLong(double d)
      {
        return (long long)floor(d);
      }
      
      int main() {
        double  a = 17.123;
        cout << hex << floorAsLongLong(a) << endl;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-18
        • 1970-01-01
        • 1970-01-01
        • 2019-04-07
        • 2015-02-14
        • 2013-12-13
        • 2011-12-25
        • 1970-01-01
        相关资源
        最近更新 更多