C++ 在地板函数之后以十六进制打印数字

c++ print number in hexadecimal right after floor function

本文关键字:十六进制 打印 数字 之后 函数 C++      更新时间:2023-10-16

我注意到 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';

由于双精度可以获得非常大的数字,我担心在将截断的数字存储在长长变量中时会出现错误的输出,有什么建议或改进吗?

引用 CPPreference 的文档页面供std::hex(和朋友)使用

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

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

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

或执行相同操作的函数。

如果值始终为正数,则<cstdint>中的uintmax_t对于获取最大可用整数可能很有用。毕竟,什么是负十六进制数?

由于double值很容易超过可用整数的最大分辨率,因此这不会涵盖整个范围。如果地板值超过整数类型可以容纳的值,则必须手动进行转换或使用大的整数库。

旁注:std::hexfloat做了一些非常不同的事情,并且由于当前标准中的一些措辞不佳,因此无法在所有编译器中正常工作,该标准已被敲定,应在下一次修订中更正。

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

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