如何将任意单位的std::chrono::duration转换为秒以计算伤害?
解决std::chrono::duration转浮点秒数的问题
首先说你代码里的编译错误:那是个低级笔误——std::chrono:duration里的冒号少写了一个,应该是两个冒号std::chrono::duration,修正后那段测试代码就能正常编译,输出0.005。
接下来解决核心需求:把任意单位的std::chrono::duration转成带小数的秒数,用来计算总伤害。
正确转换方法
不管timeInterval是seconds、milliseconds还是其他chrono时长类型,直接把它转换成以秒为周期的浮点型duration,再调用count()就能得到精确的浮点秒数:
// 通用转换代码 float timeIntervalInSeconds = std::chrono::duration<double>(timeInterval).count(); float totalDamage = DamagePerSecond * timeIntervalInSeconds;
原理是:std::chrono::duration<double>默认的周期就是秒(等价于std::chrono::duration<double, std::chrono::seconds::period>),它可以接收任意单位的duration并自动完成单位换算,返回的count()就是带小数的秒数值。
另一种更明确的写法
如果你想更清晰地表达“转换为浮点秒”的意图,也可以用duration_cast显式转换:
float timeIntervalInSeconds = std::chrono::duration_cast<std::chrono::duration<double>>(timeInterval).count();
为什么之前的方法不行?
你之前用duration_cast转std::chrono::seconds后取count(),得到的是整数秒,因为std::chrono::seconds的底层存储类型是整数(通常是long long),duration_cast会直接截断小数部分,自然满足不了浮点精度需求。
内容的提问来源于stack exchange,提问作者DSiegmeyer
相关产品推荐
相关产品推荐

