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,例如,您在工程应用程序中的舍入方式与银行应用程序(公平舍入的来源)不同。必须编写自己的舍入函数绝对不是什么不寻常的事情。
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,例如,您在工程应用程序中的舍入方式与银行应用程序(公平舍入的来源)不同。必须编写自己的舍入函数绝对不是什么不寻常的事情。