问题描述
std::chrono::round
恰好在数字之间时舍入到最接近的偶数,而不是从0舍入。
std::chrono::round<std::chrono::seconds>(3500ms) // = 4
std::chrono::round<std::chrono::seconds>(4500ms) // = 4 (instead of 5)
(旁问:为什么要这么做?)。我想知道它们是否是chrono的普通舍入函数,例如std::round()
?
解决方法
实际上,对于工程,图形,DSP等,公平取整不是很有用...
您必须自己动手。这是工程中使用的标准舍入。这将为您提供与工程相关的任务的最一致的舍入。
auto rounded_to_nearest_s = std::chrono::floor<std::chrono::seconds>(time + 500ms);
请记住,舍入实际上是与域相关的,例如,工程应用程序中的舍入方式与银行应用程序中的舍入方式不同(例如,公平舍入来自银行应用程序)。不必编写自己的舍入函数绝对不寻常。
,不,没有一个人的行为与std::round
相同。
不过,您还可以使用std::chrono::ceil
和std::chrono::floor
。
您当然可以使用以下方法快速进行自己的取整:
roundedTime = time % 500 ? chrono::round(time) : chrono::ceil(time)
或从头开始编写自己的内容:
roundedTime = time / 1000 + (time % 1000 >= 500 ? 1 : 0)
注意:它们只是伪代码,因为我不记得std::chrono
的确切语法。