0

我用 读入一个文件ifstream,我想写出cout已经读过多少文件,以百分比为单位。

long length = 0, now = 0;
int i = 0;
double d = 0;

file.seekg( 0, std::ios::end );
length = file.teelg();
file.seekg( 0, std::ios::beg );

while ( std::getline( file, buffer ) ) {
    now = file.teelg;

    i = now / length * 100;
    d = now / length * 100;

    std::cout << length << " "      // working
              << now << " "     // working
              << ( now / length * 100 ) << " "  // not working = 0
              << i << " "           // not working = 0
              << d;         // not working = 0
}

只有now = length向我表明它是100%,但每隔一次它就会失败并给我回来0。我可以想象,答案很简单1*1,但现在我找不到解决方案。我也尝试过铸造,也许是因为这就是问题所在,但当然没有。

4

6 回答 6

6

除非其中一个操作数是 afloatdouble,否则/会进行整数除法并丢弃余数。

像这样写:

( (double)now / length * 100 )
于 2012-11-29T16:20:33.253 回答
6

如果length > nowthennow / length在整数除法中为零。先施法加倍。

于 2012-11-29T16:20:33.777 回答
2

将计算转换为浮点数

i = (float)now / length * 100;
d = (float)now / length * 100;

本质上,如果您除整数,则向下舍入到最接近的数字。因此你只能有 0 或 1。然后它乘以 100。

或者,您可以这样做:

i = 100 * now / length;
d = 100 * now / length;

这个数字乘以 100 后会向下取整。

于 2012-11-29T16:21:03.917 回答
1

试试(now * 100) / length。这是因为结果now / length被转换为int,所以它可能只是01

于 2012-11-29T16:21:54.730 回答
1

或者,为了避免浮动除法,您也可以先乘,然后除:

(now * 100) / length
于 2012-11-29T16:22:53.797 回答
1

你的表情

( now / length * 100 )

从左到右进行评估,因此如下所示:

int tmp    = now / length
int result = tmp * 100

因为 ...

5.6 乘法运算符 [expr.mul]

[...] 对于整数操作数, / 运算符产生代数商,其中任何小数部分被丢弃 [...]

... 对于 any now < length,结果将为零。

添加浮点转换可以帮助:

5 个表达式 [expr]

10:许多期望算术或枚举类型的操作数的二元运算符会导致转换并以类似的方式产生结果类型。目的是产生一个通用类型,这也是结果的类型。这种模式称为通常的算术转换,其定义如下:

  • ...
  • 如果任一操作数是 long double 类型,则另一个应转换为 long double。
  • 否则,如果任一操作数为双精度,则另一个应转换为双精度。
  • 否则,如果任一操作数为浮点数,则另一个应转换为浮点数。
  • ...

所以总而言之,对于任何两个原始操作数(或任何非重载operator/),如果一个操作数是浮点类型,则另一个操作数也将转换为浮点类型:

float(now) / length * 100

...将所有操作数转换为浮点数:

float tmp    = float(now) / length
float result = tmp * 100.0f

但是您也可以重新排列您的计算以不使用任何浮点数学:

i = 100*now / length;
d = 100*now / length

然后根据需要给出一个整数。

如果您想知道为什么这在数学上有效:

  100*now              now
 ----------  = 100 * --------
   length             length

左边是你现在拥有的,右边是你曾经拥有的。两者是等价的,但是当涉及到有限数据类型时,执行顺序变得高度相关。

于 2012-11-29T16:47:00.200 回答