c - 为什么 4.7 在 c 中是 4.6999999
问题描述
'
#include <stdio.h>
#include <math.h>
int main(){
int i;
float num = 4.700;
for(i=1;i<5;i++){
printf("%0.3f\tx%d\t\t=%d\n",num,(int)pow(10,i),(int)(num*pow(10,i)));
}
return 0;
}
' 此代码将以下内容打印到控制台:'
4.7000 x10 =46
4.7000 x100 =469
4.7000 x1000 =4699
4.7000 x10000 =46999
' 此结果与所有浮点值不一致
1.2000 打印出来 ...120...1200 等
1.8000 又奇怪了
我在 Codeblocks 工作,我的问题是为什么有些浮点数会以这种方式做出反应?我缺少 C 或 mingw 编译器的一些基本内容吗?还是我的代码有问题?
感谢您的帮助,如果这是一个重复的问题,我们很抱歉
解决方案
这是有限精度表示的本质。当你尝试使用一个无法准确表示的数字时,就会发生这种事情。
有限精度小数也会发生同样的事情。如果使用六位数,则只能将 1/3 表示为“0.333333”。但是现在 3 乘以 1/3 将不等于 1。您可以将 2/3 表示为“0.666667”,但现在 1/3 乘以 2 将不等于 2/3。
4.7 不能用二进制精确表示,就像 1/3 不能用十进制精确表示一样。使用最接近的可能表示,只是稍微小一些。
推荐阅读
- python - 用python编写[1:20,25:30]最有效的方法是什么
- reactjs - 电子中有没有办法推送键盘事件?
- image - ValueError:检查输入时出错:预期 conv3d_1_input 的形状为 (704, 11, 3, 1) 但得到的数组的形状为 (72000, 704, 11, 3)
- html - 使表格中文本下的数字居中,该表格向左居中
- symfony - 如何下载 GitHub 网站以外的 Symfony 库
- c# - 使用视图模型上的属性进行 MVC 排序
- python - 在抓取 json 文件时合并池
- php - 用于推送通知的简单 PHP + NodeJS 方法
- javascript - Firebase如何在断开连接时从存储中删除图像?
- binary-tree - 证明具有 n 个叶子的二叉树的高度至少为 log n