【问题标题】:Objective c countOfBytesReceived over countOfBytesExpectedToReceive returns 0.000000Objective c countOfBytesReceived over countOfBytesExpectedToReceive 返回 0.000000
【发布时间】:2018-03-01 16:21:51
【问题描述】:

我正在尝试解决countOfBytesReceived / countOfBytesExpectedToReceive,但它要么返回0.000000,要么返回1.000000

我对@9​​87654325@ 和countOfBytesExpectedToReceive 都进行了NSLog,我可以看到countOfBytesExpectedToReceive 与预期相同,而countOfBytesReceived 发生了变化。

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

[progressView setProgress:progressRatio];

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

progressRatio 总是返回 0.0000001.000000,而不应返回。

我在 scheduledTimerWithTimeInterval 中有这段代码,所以它确实每 0.01 运行一次。

我做错了什么?

【问题讨论】:

    标签: ios objective-c integer-division


    【解决方案1】:

    这是因为 progressRatio 是用两个整数值相除的。在 C 中,当您将两个整数相除时,您会得到一个整数。那是。添加强制转换以获得浮点数:

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

    【讨论】:

      【解决方案2】:

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

      (int64_t)a / (int64_t)b

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

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

      (float)ratio = (int64_t)n

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

      如果要进行浮点除法,强制C将原始整数转换为浮点值

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

      【讨论】:

        猜你喜欢
        • 2015-01-06
        • 1970-01-01
        • 2018-11-30
        • 2016-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多