如何将std::chrono::steady_clock::time_point转为高精度浮点型时间差?
解决std::chrono::steady_clock时间点转高精度浮点秒数的问题
首先看你的代码,有两个关键问题导致你只能拿到0或1的整数结果,咱们一步步来修正:
问题分析
- 时间点未更新:你在循环外把
finish赋值成了start,循环里没有重新获取当前时间,所以finish - start永远是0,自然输出0。如果后来你手动调整过finish的赋值位置,但还是得到整数结果,那就是第二个问题导致的。 - 整数除法截断精度:
std::chrono::nanoseconds::count()返回的是整数类型(通常是long long),当你用这个整数除以整数1000000000时,C++会执行整数除法,直接截断小数部分——哪怕实际时间差是1.5秒,结果也会被砍成1,小于1秒的话就直接变成0。
解决方案
这里有两种简单的方式来获取像1.13715263724这样的高精度浮点秒数:
方式一:直接用浮点类型的duration
std::chrono支持直接将时间差转换为浮点类型的duration,比如std::chrono::duration<long double>,这样调用count()就能直接得到带小数的秒数:
#include <iostream> #include <chrono> #include <thread> // 用于延迟输出,避免刷屏 int main() { std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now(); while (true) { // 每次循环都更新finish为当前时间 std::chrono::steady_clock::time_point finish = std::chrono::steady_clock::now(); // 直接转换为long double类型的秒数duration long double elapsedTime = std::chrono::duration_cast<std::chrono::duration<long double>>(finish - start).count(); std::cout << "Time elapsed (in seconds): " << elapsedTime << std::endl; // 加10毫秒延迟,避免输出刷屏 std::this_thread::sleep_for(std::chrono::milliseconds(10)); } return 0; }
方式二:强制触发浮点除法
如果你还是想用nanoseconds的count值计算,只需要把除数改成浮点类型(比如1000000000.0L),这样C++会自动把整数的count值提升为浮点类型再做除法,完整保留小数部分:
#include <iostream> #include <chrono> #include <thread> int main() { std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now(); while (true) { std::chrono::steady_clock::time_point finish = std::chrono::steady_clock::now(); auto nsElapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(finish - start).count(); // 用long double类型的常量做除法,触发浮点运算 long double elapsedTime = nsElapsed / 1000000000.0L; std::cout << "Time elapsed (in seconds): " << elapsedTime << std::endl; std::this_thread::sleep_for(std::chrono::milliseconds(10)); } return 0; }
额外提示
- 循环里如果不加延迟,输出会刷屏得非常快,建议加上
std::this_thread::sleep_for来控制输出频率(需要包含<thread>头文件)。 - 你选择
steady_clock是正确的,它是单调时钟,不会因为系统时间调整而出现时间差为负或跳变的情况,非常适合计算时间间隔。
内容的提问来源于stack exchange,提问作者Ggsgn Hdjwngnf
相关产品推荐
相关产品推荐

