2009-08-25 112 views
6

嗨数舍去我要舍这样的双号在C(远离零)++:C++从零开始

4.2 ----> 5 
    5.7 ----> 6 
-7.8 ----> -8 
-34.2 ----> -35 

什么是有效的方式做到这一点?

+1

从(原来的)标题为“C++双四舍五入“,我以为你的意思是四舍五入数字,只是为了确保:-) – paxdiablo 2009-08-25 07:26:35

+0

你是对的:D thx编辑它 – Emre 2009-08-25 07:39:46

回答

25
inline double myround(double x) 
{ 
    return x < 0 ? floor(x) : ceil(x); 
} 

the article Huppie cites提到的,这是最好的表现为跨所有浮点类型作品的模板

http://en.cppreference.com/w/cpp/numeric/math/floorhttp://en.cppreference.com/w/cpp/numeric/math/floor

,或者由于大同,非功能版本:

x = (x < 0) ? floor(x) : ceil(x); 
+0

谢谢你的工作 – Emre 2009-08-25 07:20:42

+0

良好的通话,@Ruben,增加了一个无功能的变体,并给了你一票。希望你不介意(编辑,也就是说,你显然不介意投票)。 – paxdiablo 2009-08-25 07:32:32

+0

等待3k本人 - 添加到内联说明符中 - 我倾向于尝试找到一个好名字并将其粘贴到util lib中,可能作为所有浮动模板 - 它不会花费任何效率,并且可以让您快速隔离或更改它的所有用法 – 2009-08-25 07:56:53

-1

尝试

double rounded = _copysign(ceil(abs(x)), x); 
+0

不适用于负数 – 2009-08-25 07:17:03

+0

但是如果我的值是-3.4,ceil会返回更大的整数值和我加0.5它将是-2.9和ceil将返回-2我想要做的事情-4 – Emre 2009-08-25 07:18:58

+1

ceil(x + 0.5)fo r x = 5.7会产生7而不是6,不是吗? – samuil 2009-08-25 07:19:04

2

关于CPlusPlus.com上的类似问题有一篇不错的文章。最简单的解决问题的方法应该是这样的:

double customRound(double value) const { 
    return value < 0 ? floor(value) : ceil(value); 
} 

更好的解决办法是在文章中提到的,它使用一个模板:

//-------------------------------------------------------------------------- 
// symmetric round up 
// Bias: away from zero 
template <typename FloatType> 
FloatType ceil0(const FloatType& value) 
{ 
    FloatType result = std::ceil(std::fabs(value)); 
    return (value < 0.0) ? -result : result; 
} 
+1

为什么不称为customFloor - 它既不是:P – 2009-08-25 07:22:35

+0

我在引用的文章中看到它的内容为 template FloatType ceil0(const FloatType& value) { FloatType result = std::ceil(std::fabs(value)); return (value < 0.0) ? -result : result; } 有趣的文章,+1 – 2009-08-25 07:24:56

+0

@Ruben Bartelink:'Round'应该更好:)... btw ..你有一些忍者打字技巧;-) – Huppie 2009-08-25 07:25:05