c - 将 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],有什么奇怪的。有人可以解释这种行为吗?
解决方案
每次将 float 转换为 int 都是一个舍入,所以每次你这样做时,停下来想一想:这次我需要什么样的舍入?去掉小数部分?地面()?细胞()?或者将正浮点数舍入到最近的整数?如果应该是,使用,不是。5.999999999999
6
(int)(t+.5)
(int)t
或者您可以模仿printf
行为并仅舍入最小的float
部分,这可能会有所不同(取决于您使用的最大值)。(int)(t+.000001)
将两者舍1.9
入为 1(可能应该),并将 3.9999999999 舍入为 4(因为它是4 有一些微小的数字表示错误)。
但是,您应该知道分数的大小,这可能是数据中实际的、有意义的部分。小于此分数的所有内容都必须四舍五入。它可以是.00000001
或.5
,这取决于您的需求和算法本身。
推荐阅读
- android - 当我将 android:ems 的值放入 dimens.xml 时,为什么我的应用程序会崩溃?
- php - 上传的文件无法移动到 wp-content/uploads/2019/06
- angular - Angular 7:带有组件并传递可变参数的 *ngFor
- c# - 是否可以将 ASP.NET Core Identity 添加到 WebForms 项目?
- spring-boot - 配置 Spring WebFlux WebClient 以使用自定义线程池
- nativescript - 音频播放器插件播放 URL 声音,但不播放本地声音文件
- excel - 将多个工作簿合并为一个后,颜色格式丢失
- react-native - 无法解析模块“metro/src/lib/bundle-modules/HMRClient”
- php - 如何将 /?lang=en 重定向到 /en?
- python - 如何为具有多个类的应用程序创建保存功能?