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