c ++在floor函数之后以十六进制打印数字
c++ print number in hexadecimal right after floor function
我注意到 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 变量中时输出错误,有什么建议或改进吗?
Quoting CPPreference's documentation page for std::hex
(and friends)
Modifies the default numeric base for integer I/O.
这表明 std::hex
对浮点输入没有任何影响。您将获得的最好的是
cout << hex << static_cast<long long>(floor(a)) << '\n';
或具有相同功能的函数。
如果值始终为正,uintmax_t
来自 <cstdint>
可能有助于获得最大的可用整数。毕竟,什么是负十六进制数?
由于 double
值很容易超过可用整数的最大分辨率,因此不会覆盖整个范围。如果 floored 值超过整数类型所能容纳的值,您将不得不手动进行转换或使用大整数库。
旁注:std::hexfloat
确实 something very different and does not work correctly in all compilers due to some poor wording in the current Standard 已经敲定,应该在下一次修订中更正。
只需编写您自己的 floor 版本并使其 return 成为一个整数值。例如:
long long floorAsLongLong(double d)
{
return (long long)floor(d);
}
int main() {
double a = 17.123;
cout << hex << floorAsLongLong(a) << endl;
}
我注意到 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 变量中时输出错误,有什么建议或改进吗?
Quoting CPPreference's documentation page for std::hex
(and friends)
Modifies the default numeric base for integer I/O.
这表明 std::hex
对浮点输入没有任何影响。您将获得的最好的是
cout << hex << static_cast<long long>(floor(a)) << '\n';
或具有相同功能的函数。
如果值始终为正,uintmax_t
来自 <cstdint>
可能有助于获得最大的可用整数。毕竟,什么是负十六进制数?
由于 double
值很容易超过可用整数的最大分辨率,因此不会覆盖整个范围。如果 floored 值超过整数类型所能容纳的值,您将不得不手动进行转换或使用大整数库。
旁注:std::hexfloat
确实 something very different and does not work correctly in all compilers due to some poor wording in the current Standard 已经敲定,应该在下一次修订中更正。
只需编写您自己的 floor 版本并使其 return 成为一个整数值。例如:
long long floorAsLongLong(double d)
{
return (long long)floor(d);
}
int main() {
double a = 17.123;
cout << hex << floorAsLongLong(a) << endl;
}