2009-08-25 108 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