c ++ chrono是否具有正常的舍入功能,该值在平局时从0舍入?

问题描述

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::ceilstd::chrono::floor

您当然可以使用以下方法快速进行自己的取整:

roundedTime = time % 500 ? chrono::round(time) : chrono::ceil(time) 

或从头开始编写自己的内容:

roundedTime = time / 1000 + (time % 1000 >= 500 ? 1 : 0)

注意:它们只是伪代码,因为我不记得std::chrono的确切语法。