2016-05-24 105 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中表示。