You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 18:52:35