将正数或负数四舍五入

6

我需要对一个数字进行四舍五入,但我不知道这个数字是正还是负。

有没有更好的方法来舍入 foo,而不是这样做:

static_cast<int>(foo > 0 ? foo + 0.5 : foo - 0.5)

基本上我想要的行为是:
3.4 => 3 3.5 => 4 -3.4 => -3 -3.5 => -4
3个回答

8

1
我知道这扩展了问题,但在C++11之前有没有任何方法可以做到这一点? - Jonathan Mee
1
我接受这个答案,但是我想指出如果您无法访问C++11或者更简单地执行static_cast<int>(foo + 0.5 - (foo < 0.0)),那么Glenn Teitebaum的回答也是一个很好的解决方案。 - Jonathan Mee

4

回到老式的C技巧,这些技巧依赖于booltrue转换为1,将false转换为0:

 static_cast <int>(foo + 0.5 - (foo < 0.0))

通常情况下,您应该使用库函数,但如果这是关键部分,您可以对其进行性能测试。


我喜欢使用条件的想法,但不喜欢在它上面分支。但我认为我们可以比你的解决方案做得更好:https://dev59.com/nIzda4cB1Zd3GeqPn46a#bbnmnYgBc1ULPQZFcPlD - Jonathan Mee
@JonathanMee 你介意我更新解决方案以展示你的简化数学吗? - Glenn Teitelbaum
1
不错,听起来很好。将简化的数学公式作为解决方案会很好。 - Jonathan Mee

1
在 C 数学库中,有一个标准的 HTML 标签:


double round  (double x);

或者存在。
double nearbyint  (double x);

这些是不错的选择,但它们仍然需要我使用 static_castlround 也会将值放在整数格式中。 - Jonathan Mee
除了 round (double) 之外,还有 roundf (float) 和 roundl (long double)。 - leetNightshade

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接