从双倍到时间的转换
Conversion from double to time
我正在开发的应用程序使用双精度类型进行距离计算。因此,最后我有一个变量类型双精度(比如deferTime = 0.024 seconds
(,这是一个基于两个节点之间距离的比率。
我想使用此比率来安排类型time::seconds
的事件。在 API 定义下方:
scheduleEvent (const time::nanoseconds & after, const EventCallback & callback)
在我的库文件中,我声明deferTime
如下:
time::seconds meanWaiting;
在我的.cpp文件中,我将比率分配给deferTime
:(**使用秒而不是纳秒更新**(
meanWaiting = std::chrono::duration<double>{(maxWait *
(maxDistance - distance) / maxDistance)};
但我收到以下错误:
error: no match for ‘operator=’ (operand types are ‘boost::chrono::seconds {aka boost::chrono::duration<long int>}’ and ‘std::chrono::duration<double>’)
meanWaiting = std::chrono::duration<double>{(maxWait * (maxDistance - distance) / maxDistance)};
^
In file included from /usr/include/boost/chrono/chrono.hpp:11:0,
from /usr/include/boost/chrono/include.hpp:15,
from /usr/include/boost/chrono.hpp:17,
from /usr/local/include/ndn-cxx/util/time.hpp:26,
from /usr/local/include/ndn-cxx/name-component.hpp:28,
from /usr/local/include/ndn-cxx/name.hpp:30,
from /usr/local/include/ndn-cxx/interest.hpp:25,
from ./../core/common.hpp:57,
from <command-line>:0:
/usr/include/boost/chrono/duration.hpp:465:19: note: candidate: boost::chrono::duration<Rep, Period>& boost::chrono::duration<Rep, Period>::operator=(const boost::chrono::duration<Rep, Period>&) [with Rep = long int; Period = boost::ratio<1l>]
duration& operator=(const duration& rhs) = default;
^
/usr/include/boost/chrono/duration.hpp:465:19: note: no known conversion for argument 1 from ‘std::chrono::duration<double>’ to ‘const boost::chrono::duration<long int>&’
可以在此处找到 ndn-cxx 库。
using namespace std::chrono;
meanWaiting = duration_cast<nanoseconds>(
duration<double>{(maxWait * (maxDistance - distance) / maxDistance)});
duration<double>
将您的替身变成存储为双精度seconds
。 接下来,您将这些seconds
投射到nanoseconds
.
在 C++17 中,如果需要,您可以将duration_cast
替换为其他舍入模式:
duration_cast
:截断为零。floor
:截断为负无穷大。ceil
:截断到正无穷大。round
:向最接近的积分舍入,以平局为偶数。
如果它对你的应用程序很重要,你不能等到C++17,那么这些开源实现就四处游荡,很容易找到。
通常,有两种情况需要使用duration_cast
或其他一些显式舍入模式:
当您将精细持续时间分配或复制到粗持续时间时(例如
nanoseconds
至seconds
(,以及从基于浮点的持续时间分配或复制到基于积分的持续时间时。
上述两种转换都涉及截断错误。 因此<chrono>
要求您通过使用duration_cast
明确确认您希望截断。
对于不涉及截断错误的转换(例如,从整秒到整纳秒,或整数持续时间到任何浮点持续时间(,可以使用隐式转换语法。
在修改后的答案中,meanWaiting
seconds
而不是nanoseconds
,仍然需要duration_cast
,因为您将截断双精度duration
的小数部分:
meanWaiting = duration_cast<seconds>(
duration<double>{(maxWait * (maxDistance - distance) / maxDistance)});
有关<chrono>
的完整视频教程,请参阅我的Cppcon 2016演讲:https://www.youtube.com/watch?v=P32hvk8b13M
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 如何正确将字符串转换为标准::时间::system_clock::time_point?
- C++:如何将 unix 时间的字符串转换为 *tm?(使用时间错误:"cannot convert 'String' to 'tm*' ")
- 如何将时间字符串 (M:SS) 转换为浮点数
- 将 hh:mm:ss.zzz 时间 QString 转换为毫秒的单行函数?
- 将字符数组转换为时间结构
- 编译时间文本到数字转换 (atoi)
- 如何将我的每个矢量字符串转换为纪元时间日期
- 将 unix 时间戳转换为人类可读的日期
- 没有从"int"到"时间"的可行转换
- 将毫秒转换为给定格式的持续时间
- 使用 C++将时间戳转换为格式化的日期时间
- 如何将 time-uuid(存储在 boost uuid 中)转换为时间戳/自纪元以来的时间?
- 从双秒到标准::时间:steady_clock::d的简短转换?
- 时间转换为 24 小时格式 cpp
- 将 boost:::chrono::steady_clock::time_point 转换为标准::时间::steady
- C++:将Unix时间转换为非本地时区
- 将日期字符串转换为 unix 时间戳
- 递归基转换时间复杂度分析
- 是否有简单的方法在C/ c++中获得Linux下的夏令时转换时间?