为什么这个函数返回零?

问题描述 投票:-4回答:4

当我输入2.75的持续时间时,当我需要'and 0 minute(s)'返回时,此函数返回'and 45 minute(s)'。问题出在else if部分。

void duration_time_min(double duration)
{
  int duration_min;

  if (duration < 1)
  {
    duration_min = duration * 60; // decimal times 60 converted to int
    printf("Trip duration: 0 hour(s) and %i minute(s)\n", duration_min);
  }
  else if (duration > 1)
  {
    duration_min = (int) duration; // cast double to int
    duration_min = duration_min - duration; // get decimal value for min
    duration_min = duration_min * 60;
    printf("and %i minute(s)\n", duration_min);
  }
  return;
}
c
4个回答
3
投票

问题就在于此

duration_min = duration_min - duration; // get decimal value for min

你最终在那条线上使duration_min为零,因为它是int类型。它不能捕获小数点后的任何内容。

此外,逻辑是不正确的。你需要使用duration - duration_min

使用浮点来捕获差异。

double temp = duration - duration_min;
duration_min = temp * 60;

此外,不要指望输出是精确的,因为浮点表示并不总是精确的。


1
投票

当你通过持续时间= 2.75时会发生以下事情

如果部分符合预期,它会进入其他地方

duration_min = (int) duration; // duration_min=2;duration=2.75
duration_min = duration_min - duration; /* value for (duration_min - duration) = -0.75 
                                         but duration_min is int it will be converted to 0; 
                                         so after this statement execute 
                                         duration_min = 0 */
duration_min = duration_min * 60; //duration_min = 0

0
投票

您的计划中有两个问题:

duration_min = duration_min - duration;

由于你的duration_min是2,这一行使得duration_min = 2-2.75 = 0.要解决此问题,你的行需要:

duration_min = duration-duration_min;

但现在出现另一个问题:我们试图在整数内存储一个十进制值。为了解决这个问题,我们有两种方法:将duration_min的类型更改为double(并更改多个其他内容)或者在同一行上再乘以60。如果我们使用secound选项,该行将如下所示:

duration_min = (duration-duration_min)* 60;

0
投票

在调试器下执行程序并单步执行,可以帮助您理解问题:

 // duration=2.75
 duration_min = (int) duration;
 // duration_min = 2

 // now:        duration_min - duration = 2 - 2.75 = -0.75
 // but 0.75 has to be converted to int value 
 // (int) 0.75 = 0 
 duration_min = duration_min - duration; // get decimal value for min
 // so  `duration_min` = 0  

当你混合doubleint值时要小心。当double转换为int时,它总是被截断。

您的程序还有另一个问题。它不会打印任何持续时间= 1小时。

看看可能的解决方案。保持单独的int值数小时和double几分钟。然后你就可以清楚地分开这两者了。它使计算更加明显。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void duration_time_min(double duration)
{
    double duration_min;
    int hours;

   if(duration == 1.0)
   {
       printf("Trip duration: 1 hour\n");
       return;
   }

   if (duration < 1.0)   //  duration less then hour
   {
        duration_min = duration * 60.0; 
        printf("Trip duration: 0 hours and %.1f minute(s)\n", duration_min);
        return;
   }

    // (duration > 1.0) // more than hour

    hours = (int) duration;              // cast double to int, get hours
    duration_min = duration - hours;     // get fraction part for the minutes
    duration_min = duration_min * 60.0;  // calculate minutes

    printf("Trip duration: %d hours and %.1f minute(s)\n", hours, duration_min);
 }

int main(void)
{
    duration_time_min(1.0);
    duration_time_min(0.75);
    duration_time_min(2.75);

    return 0;
}

输出:

Trip duration: 1 hour
Trip duration: 0 hours and 45.0 minute(s)
Trip duration: 2 hours and 45.0 minute(s)
© www.soinside.com 2019 - 2024. All rights reserved.