2013-08-19 36 views
0

我最近遇到以下一段代碼來顯示2個十進制數字。舍入小數到2位之間的邏輯C++

val = ((int)(val*100.0))/100.0 

結果如所述,但我沒有得到它的功能背後的邏輯。任何人都可以請解釋。 謝謝。

+1

這是確切的代碼?我希望在乘法和除法之間有一個整型。 – Angew

+1

你確定它不是更像'val = round(val * 100)/ 100'嗎?您發佈的代碼將保持該值(或多或少)不變,除非它溢出。 –

+0

你在任何地方都使用float常量,所以我不明白這將如何完成任何事情。 – OldProgrammer

回答

3

如果實際的代碼看起來是這樣的:

float val = 3.141592654; 
val = ((int)(val * 100.0))/100.0; // result would be 3.14 

然後它背後的邏輯是,轉換爲整數會截斷小數。所以乘以10^n(其中n是你想要的十進制數中的位數),然後將其轉換成十進制數到右邊的位置,然後刪除剩餘的十進制數。然後,您將它重新放回一個浮點數併除以10^n以獲得所需的結果。

1

我想你錯過了代碼的一些基本細節 - 我不認爲你顯示的代碼會做任何事情,特別是不捨入。看起來像這段代碼試圖截斷第二位數字後的所有內容。

假設它是一個float數據類型,以下是您正在查找的內容(用於截斷)。 我分裂它爲(更)簡單:

float val = 42.1234; 
int helpVal = val *100;  //produces 4212, the rest will simply be cut off 
float roundedVal = helpVal/100.0; //produces 42.12 

使其更短,你也可以一起去:

float val = 42.1234; 
float roundedVal = ((int) (val*100))/100.0; 
+1

對於OP的信息,這將*截斷*,而不是* round *,最後兩位數字。試用42.9876,這應該* *爲42.99。描述是準確的。好(+1) – WhozCraig

+0

好吧,我的錯。正在回答問題文本(沒有提到四捨五入),但不知何故設法忽略標題... – The13thToast

+0

你的回答是準確的(事實上你的評論「......將被簡單地切斷......」是正確的) 。這是爲了OP的好處,而不是你的。我投了你的答案。 (可變名稱的選擇很差,嘿,但*算法*的描述很好)。 – WhozCraig