当我输入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;
}
答案 0 :(得分: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 :(得分: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
答案 2 :(得分: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;
答案 3 :(得分: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
混合double
和int
值时要小心。当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)