Objective c countOfBytesReceived 超过 countOfBytesExpectedToReceive returns 0.000000

Objective c countOfBytesReceived over countOfBytesExpectedToReceive returns 0.000000

我正在尝试计算 countOfBytesReceived / countOfBytesExpectedToReceive 但它要么是 returns 0.000000 要么是 1.000000.

我在 countOfBytesReceivedcountOfBytesExpectedToReceive 上都做了一个 NSLog 我可以看到 countOfBytesExpectedToReceive 与预期保持一致并且 countOfBytesReceived 发生了变化。

CGFloat progressRatio = [task countOfBytesReceived] / [task countOfBytesExpectedToReceive];

[progressView setProgress:progressRatio];

NSLog(@"%lld", [task countOfBytesReceived]);
NSLog(@"%lld", [task countOfBytesExpectedToReceive]);
NSLog(@"%f)", progressRatio);

progressRatio 总是 returns 0.0000001.000000 不应该的时候。

我在 scheduledTimerWithTimeInterval 中有此代码,所以它每 0.01 运行。

我做错了什么?

这是因为 progressRatio 是用两个整数值相除计算得出的。在 C 中,当您将两个整数相除时,您会得到一个整数。那是。添加铸件以获得浮点数:

CGFloat progressRatio = (CGFloat) [task countOfBytesReceived] / (CGFloat )[task countOfBytesExpectedToReceive];

countOfBytesRecievedcountOfBytesExpectedToReceive 都是 64 位整数。 C 表达式求值会将二进制表达式的左参数或右参数提升为最兼容的类型。

(int64_t)a / (int64_t)b

但是由于这个表达式的两边都是 64 位整数,所以不需要转换并且它执行整数数学运算。鉴于这些值的性质,结果将是 0(如果 a < b)或 1(如果 a == b)。

C 然后计算下一个表达式:

(float)ratio = (int64_t)n

由于这是一个赋值,它必须将整数(10)转换为浮点值(1.00.0)。

如果要进行浮点除法,强制C把原来的整数转成浮点值:

CGFloat progressRatio = (CGFloat)[task countOfBytesReceived] / (CGFloat)[task countOfBytesExpectedToReceive];