将float转换为int会更改该值

时间:2015-01-04 02:31:18

标签: c types casting

我看过this question,但情况似乎并不相同。

我在检查寄存器程序中有一个函数,我写的是从用户读取一美元金额,验证它没有以小数分数输入,并检查用户是否输入正确。但是,我得到的是,在将100输入的浮点值乘以(int)后截断后,值会发生变化。例如,如果我输入1118.58,我可以(通过调试printf语句)验证是否已扫描1118.58并正确分配给amt,并且我的while条件(int)100 * amt == 100 * amt是正确的测试为TRUE,但在转换为整数后,整数值存储为111857.更令人困惑的是,每个值都不会发生(尽管我在测试中进展顺利,这是第一个条目我看到过改变这种方式。)

我在Kubuntu 14.04 64位上使用gcc,在我的编译命令中使用C99标准设置。 这是给出问题的函数(假设你不想/需要看到完整程序的1300行)。注意:为方便起见,我在头文件中定义了布尔值和运算符 - 我最近发现有一种标准方法可以做到这一点,但还没有转换我的头文件。

int get_amt (void)
{
  float amt;
  int scanned, i_amt;
  int success = FALSE;
  char yn = '\0';

  while (NOT success)
  {
    scanned = scanf("%f%*c", &amt);

    /* validate and verify amount */
    if (scanned >= 1 AND (int)100*amt == 100*amt AND amt <= 100000)
    {
      i_amt = (int)(100 * amt);
      printf("\n amt = %4.2f i_amt = %i", amt, i_amt);
      printf("\nYou entered $%i.%.2i -- Correct (Y/n)?", i_amt/100, i_amt%100);
      scanf("%c%*c", &yn);
      if (yn == '\0' OR yn == 'Y' OR yn == 'y')
        success = TRUE;
    }
  }
  return (i_amt);
}

这是带有debug print语句的输出示例:

Enter deposit amount (dollars and cents): $ 1118.58                             

 amt = 1118.58 i_amt = 111857                                                   
You entered $1118.57 -- Correct (Y/n)?                                          

为什么会发生这种情况,我该如何解决?

在下面的评论中讨论后,我已经将函数转换为使用整数,因此不存在浮点精度问题(我没有真正考虑过标准浮点数在64位操作系统上的精度有多少编译器)。这是更新版本,由于没有浮点数,因此无法解决此问题:

int get_amt (void)
{
  int scanned, amt1, amt2;
  int success = FALSE;
  char yn = '\0';

  while (NOT success)
  {
    scanned = scanf("%i.%i%*c", &amt1, &amt2);

    /* validate and verify amount */
    if (scanned >= 1)
    {
      printf("\nYou entered $%i.%.2i -- Correct (Y/n)?", amt1, amt2);
      scanf("%c%*c", &yn);
      if (yn == '\0' OR yn == 'Y' OR yn == 'y')
    success = TRUE;
    }
  }
  return (100*amt1 + amt2);
}

1 个答案:

答案 0 :(得分:4)

正如@MitchWheat已经在上面的评论中提到的那样,很可能当你打印出float时,它会向上舍入,而当你计算int时,它就会截断。使用round函数解决此问题。即i_amt = round(100 * amt);,它将以与float相同的方式对数字进行四舍五入。