c++ chrono 是否有一个正常的 round 函数,它在平局时从 0 舍入?

Does c++ chrono have a normal round function that rounds away from 0 on tie?

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()?

不,没有一个行为与 std::round 相同。

不过,还有一些 std::chrono::ceil and std::chrono::floor 可以玩。

您肯定可以使用类似以下内容快速进行自己的舍入:

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

或从头开始编写您自己的:

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

注意:它们只是伪代码,因为我不记得 std::chrono.

的确切语法

实际上,公平舍入对于工程、图形、DSP 等不是很有用...

你必须自己动手。这是工程中使用的标准舍入。这将为 engineering-related 任务提供最一致的舍入。

auto rounded_to_nearest_s = std::chrono::floor<std::chrono::seconds>(time + 500ms);

请记住,舍入实际上是 domain-dependent,例如,您在工程应用程序中的舍入方式与银行应用程序(公平舍入的来源)不同。必须编写自己的舍入函数绝对不是什么不寻常的事情。