2016-05-24 161 views
0

我已經老了PASCAL代碼帕斯卡到C:TRUNC

var i : longint; 
    m : double; 
begin 
    ..... 
    i := trunc(m); 

我必須把它轉換爲C++代碼。

這裏有一個明顯的一點就是寫

double m; 
int i; 
..... 
i = static_cast<int>(std::trunc(m)); 

但這裏的問題比帕斯卡TRUNC返回整數

function trunc(
    d: ValReal 
):Int64; 

而C++的TRUNC返回一倍。 是否有可能,例如trunc(2.3)將返回1.999999999999 和static_cast將使它1而不是2?如果是,是否正確使用不帶trunc的static_cast來獲取相同的pascal行爲?

i = static_cast<int>(m); 
+0

聽起來更像'round()'? – trojanfoe

+0

round返回最接近的整數。在帕斯卡爾我trunc – ArmanHunanyan

回答

2

當您在C++中將浮點值轉換爲整數值時,浮點值會自動截斷。

看看下面簡單的例子:

#include <iostream> 

int main() 
{ 
    double d = 12.98; 
    int i = d; 

    std::cout << "i = " << i << '\n'; 
} 

上述程序將打印

 
i = 12 

轉換像這些是由編譯器隱式進行。欲瞭解更多信息請登錄read about implicit conversions(特別是read about floating-integral conversions)。

但是,它(從鏈接參考)注意事項:

如果該值不能適合目標類型,其行爲是未定義

所以浮點值,後截斷,必須適合分配左側的整數類型。

+0

好,所以你建議static_cast (米)? – ArmanHunanyan

+0

@ArmanHunanyan不需要鑄造,編譯器會處理它。 –

+0

我知道,但我更喜歡明確鑄造。行爲是一樣的。只是編碼風格。 – ArmanHunanyan

1

double中,所有的整數(和最長的?)都可以完全表示。像trunc那樣被定義爲返回數學意義上的整數的函數將永遠不會返回非精確整數,如果它的正確返回值可以在double中表示。