首页 > 解决方案 > 将 float 转换为 int 在 C 中无法正常工作

问题描述

我试图解决一个关于代码战的任务,但发生了一些奇怪的事情,在一种情况下,铸造像往常一样工作,而在第二种情况下,出现了奇怪的行为。这是代码:

#include <stdio.h>
#include <string.h>
#include <math.h>
int digital_root(int n) {
  char tmp[30];
  char *ptr;
  while(n > 9){
    sprintf(tmp, "%d", n);
    int len = strlen(tmp);
    float n_tmp = n / (pow(10, len));
    n = 0;

    for(int i = 1; i <=len; i++){
      float t = n_tmp * (pow(10, i));
      printf(" vars = [%f , %d] ", t, (int)t); //this line
      n += (int) t;
      n_tmp -= (int)t/pow(10,i);

    }

  }

  return n;
}

int main()
{
    digital_root(16);

    return 0;
}

并且行printf(" vars = [%f , %d] ", t, (int)t);输出:vars = [1.600000 , 1] vars = [6.000000 , 5],有什么奇怪的。有人可以解释这种行为吗?

标签: ccasting

解决方案


每次将 float 转换为 int 都是一个舍入,所以每次你这样做时,停下来想一想:这次我需要什么样的舍入?去掉小数部分?地面()?细胞()?或者将正浮点数舍入到最近的整数?如果应该是,使用,不是。5.9999999999996(int)(t+.5)(int)t

或者您可以模仿printf行为并仅舍入最小的float部分,这可能会有所不同(取决于您使用的最大值)。(int)(t+.000001)将两者舍1.9入为 1(可能应该),并将 3.9999999999 舍入为 4(因为它4 有一些微小的数字表示错误)。

但是,您应该知道分数的大小,这可能是数据中实际的、有意义的部分。小于此分数的所有内容都必须四舍五入。它可以是.00000001.5,这取决于您的需求和算法本身。


推荐阅读