2 javaxq JavaXQ 于 2016.04.11 17:09 提问

c语言取小数问题,急求大神解答!

程序是#include
int main()
{
float a,b;
int n;
scanf("%f",&a);
n=(1000*a+0.5);
b=(n*1.0)/1000;
printf("%f",b);
return 0;
}
输入123.4567
输出是123.457001
输入1234.567
输出时1234.567017
输入12345.67
输出是12345.669922
为什么会这样呢?求大神解答!

3个回答

herozhangbz
herozhangbz   2016.04.11 18:03
已采纳

你去百度下浮点数的存储格式。机器只能识别0,1,需要二进制转换成十进制。理论上,有限位数的二进制浮点数必能转换为有限位数的十进制数;但对于有限位数的十进制浮点数,转换为二进制数不能保证是有限位数,且多数情况下不是有限位数。因此,如果提供足够的输出位数,二进制浮点数可以精确转换为十进制数,不产生转换误差。但是,由于没有一个2n与lOm(n,m为整数)相等,二进制和十进制相互转换的位数没有简单的若干位对应若干位的对应关系。一般地,二进制浮点数向十进制转换都只提供若干位的近似值,并不提供全部的数字位数。事实上更主要的原因是:计算机中表示的二进制浮点数绝大多数本身就是实际数值的近似值,从有效数字的角度看,转换为十进制数时提供更多位数字并无使用价值。这里自然就有一个如何看待和精确使用数值的问题,即有效数字位数的问题。尤其对于各种数值计算,必须掌握其有效数字位数。但查阅有关资料,没有看到对计算机中浮点数的有效数字位数的准确叙述,一般仅指出fIoat和doubIe型大致的有效数字位数,且说法不一,没有给出依据。在此,从相对误差(误差绝对值与数值绝对值的比值)的角度给出一般性的结论。原文http://wenku.baidu.com/link?url=j8tNlNuV1xovu3jBR_DEdJ3o5amLsDgReUR8wcZhvUr1DT3_3q7qJ1yX7M_ZESRr-tZTMgZLl5sR2Fa-5OONfsCnw_eVVlWmXL-nidrRZju

CSDNXIAON
CSDNXIAON   2016.04.11 17:13

第一次用c语言写的五子棋,求大神修改
----------------------同志你好,我是CSDN问答机器人小N,奉组织之命为你提供参考答案,编程尚未成功,同志仍需努力!

curry_du
curry_du   2016.04.11 18:15

float的精度为6~7位有效数字,多出的就可能产生误差。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
设计一个从5个整数中取最小数和最大数的程序---acm题目
描述 设计一个从5个整数中取最小数和最大数的程序 输入输入只有一组测试数据,为五个不大于1万的正整数输出输出两个数,第一个为这五个数中的最小值,第二个为这五个数中的最大值,两个数字以空格格开。样例输入 1 2 3 4 5 样例输出 1 5 #include #include int main(){ int i,j,t,a[5]; for(i=0;i<5;i+
【C】提取浮点型数据的整数部分与小数部分
来源于网络
c语言 异或 浮点数存储 分支结构
12 月 9 日随笔异或:求一组数中一个只出现一次的数的值,将数的序列全部异或。//实现ab交换 a = a^b b = a^b a = a^b悬空elseif(a == 1) if(b == 2) printf("hehe\n"); else //其实匹配的是上一个if ,会被格式迷惑 printf("haha
c语言用指针实现求最大数和最小数的程序
闲来随便做做,大家共同探讨 #include "stdafx.h" #include "stdio.h" int u,v; find_u_v (int *p,int n) {  int *q;  u=v=*p;  for(q=p;q  {if(u    else if(v>*q)  v=*q;  } } int main(int argc, char* argv[])
C语言学习之取变量后几位小数
C语言 设变量x为float型且已经赋值, 则以下语句中能够将x中的数值保留到小数点后面2位, 并将第3位四舍五入 x=(int)(x*100+0.5)/100.0
c语言中小数取整
C语言有以下几种取整方法: 1、直接赋值给整数变量。如: int i = 2.5; 或 i = (int) 2.5; 这种方法采用的是舍去小数部分 2、C/C++中的整数除法运算符“/”本身就有取整功能(int / int),但是整数除法对负数的取整结果和使用的C编译器有关。 3、floor函数。floor(x)返回的是小于或等于x的最大整数。如: floor(2.5) = 2
C语言宏定义取得两数的最大值和最小值--其实你的认为是错的!
/*本程序时为了验证用宏来做   * 两个数的大小比较的写法*/   #include   #define MAX(x,y) ((x)   #define MIN(X,Y) ({\       typeof (X) x_ = (X);\       typeof (Y) y_ = (Y);\       (x_  /*({...})的作用是将内部的几条语句中最后一条的值返回,它也允
【C语言】求最大最小值
#include int main() { int i = 0; int max = 0,min=0; int arr[10]; printf("请输入10个整数:"); for(i = 0;i < 10;i++) scanf("%d",&arr[i]); max = arr[0]; min = arr[0]; for(i = 0;i < 10;i++) { if
C语言求数组元素中的最小值
#include int array(int n,int Str[]) { int j; //int min=0; int min=Str[0]; for(j=0;j<n;j++) { if(min>Str[j]) {
求三个数的最大值和最小值(C程序)
////////////////////////////////////////////////////// //求三个数的最大值和最小值  /////////////////////////////////////////////////////  #include   #include float compTwo(float x, float y, int flag);