如何将std::chrono::duration<long double, std::ratio<1,1000000000>>转为std::chrono::nanoseconds
将long double类型的纳秒duration转换为std::chrono::nanoseconds的方法
你定义的ld是浮点型的纳秒时长对象(周期为1纳秒,数值类型是long double),而std::chrono::nanoseconds是整数型的纳秒时长对象(底层通常为long long),转换核心是把浮点数值转为整数类型的时长,以下是两种常用实现方式:
方法1:用标准工具std::chrono::duration_cast
这是C++ chrono库提供的标准转换接口,专门用于不同duration类型间的转换,浮点转整数时会直接截断小数部分。
修改后的代码示例:
#include <chrono> int main() // 注:C++标准中main函数应返回int,而非void { auto ld = std::chrono::duration<long double, std::ratio<1, 1000000000>>(0.001); // 用duration_cast完成转换 std::chrono::nanoseconds ns = std::chrono::duration_cast<std::chrono::nanoseconds>(ld); // 此时ns的数值为0,因为0.001的小数部分被截断 return 0; }
方法2:手动转换(支持四舍五入)
如果需要对浮点值做四舍五入后再转换(而非直接截断),可以先处理浮点数值,再构造整数型duration对象:
#include <chrono> #include <cmath> // 用于round函数 int main() { auto ld = std::chrono::duration<long double, std::ratio<1, 1000000000>>(0.001); // 先四舍五入浮点值,再转为long long构造nanoseconds std::chrono::nanoseconds ns(static_cast<long long>(std::round(ld.count()))); // 示例中round(0.001)结果为0,若浮点值是0.6,round后会得到1 return 0; }
注意事项
std::chrono::duration_cast转换浮点duration到整数duration时,会向零取整(截断小数),若需要其他取整规则(如向上取整),需自行处理。- 转换前要确保浮点数值在
nanoseconds的取值范围内(通常为[-9e18, 9e18]左右),超出范围会导致未定义行为。
内容的提问来源于stack exchange,提问作者Weiner Lemes
相关产品推荐
相关产品推荐

