搜索
查看: 2968|回复: 10
打印 上一主题 下一主题

float a=234.89; printf("%f",a);问为何输出234.889999

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-13 16:47:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
5啊哈币
求解释

最佳答案

查看完整内容

我们先从 float 说起。C 标准规定,float 型浮点数至少能表示6位有效数字。 在默认情况下,格式控制符 "%f" 会取变量的6位小数,尽管你已经声明变量 a = 234.89,但是 printf 函数打印 a 的值受 "%f" 格式符控制,因此输出 a 的值为 234.889999。 为什么是 234.889999,而不是234.890000或者其它? 这与你所使用的具体计算机操作系统(32位或64位)有关。 另外,float 型数值都是实际值的近似,换句话说,它不能像 int 型数 ...
楼主新帖
楼主热帖
沙发
发表于 2012-9-13 16:47:32 | 只看该作者
本帖最后由 Wuya 于 2012-9-23 21:03 编辑
190192641 发表于 2012-9-17 08:53
答案不满意
我知道怎么样才对
我要知道的是这样是怎么错的

我们先从 float 说起。C 标准规定,float 型浮点数至少能表示6位有效数字。
在默认情况下,格式控制符 "%f" 会取变量的6位小数,尽管你已经声明变量 a = 234.89,但是
printf 函数打印 a 的值受 "%f" 格式符控制,因此输出 a 的值为 234.889999。

为什么是 234.889999,而不是234.890000或者其它?
这与你所使用的具体计算机操作系统(32位或64位)有关。
另外,float 型数值都是实际值的近似,换句话说,它不能像 int 型数值那样能表示切确的值。

如果你还想进一步了解,你首先要去了解什么是计算机科学。
然后继续追问,相信你会找到满意的答案!

评分

参与人数 1啊哈币 +5 收起 理由
lzl + 5 赞一个!

查看全部评分

板凳
 楼主| 发表于 2012-9-13 16:57:28 | 只看该作者
#include <stdio.h>
int main()
{
float a=234.89;
printf("%f",a);
      sleep(5000);
      return 0;
}
地板
发表于 2012-9-13 18:58:36 | 只看该作者
浮点数有时候会不精确("%.2f",a),保留两位小数
5#
 楼主| 发表于 2012-9-14 08:48:13 | 只看该作者
知道出错
为什么是这么错,不是那么错
为什么不是234.889998或者其他
和浮点型数据的存储有什么关系
求解释
6#
发表于 2012-9-14 17:30:33 | 只看该作者
double float吧兄弟
7#
 楼主| 发表于 2012-9-17 08:53:54 | 只看该作者
答案不满意
我知道怎么样才对
我要知道的是这样是怎么错的
计算机对于234.89是怎么样存储
才会引起234.889999的输出
8#
发表于 2012-9-21 14:16:55 | 只看该作者
float a=234 结果是234.000000
float a=234.1结果是234.100006
它的精确位数是按照你的输入位数来确定的:输入a是两位位小数,它就精确到小数点后第2位,后面的数没有意义
电脑还不是建立在微积分上的存储,0.089999就是0.09的意思,只是浮点数的输出的标准格式是6~7位小数。
你要("%.2f)就能输出两位小数
9#
发表于 2012-10-3 16:56:52 | 只看该作者
2  精确下 就好了
10#
发表于 2012-10-13 21:11:32 | 只看该作者
这个原因是当代计算机的浮点计算的时候所有的浮点数都是约数,不存在完全正确的浮点数,这个不光在c语言中存在这个问题,java,php,c#等等编程语言都无法解决,当你用到浮点数进行这种类型的计算的时候要注意
7.77==7.77,这个判断是错误的,应该使用7.77>7.77-0.000001&&7.77<7.77+0.000001具体的精度视情况而定。
现在计算机都是这样,这根浮点的定义有关
11#
发表于 2013-9-13 13:40:59 | 只看该作者
magic 发表于 2012-10-13 21:11
这个原因是当代计算机的浮点计算的时候所有的浮点数都是约数,不存在完全正确的浮点数,这个不光在c语言中存 ...

虽然是很久之前的帖子了,但还是回复一下吧

首先假设浮点数执行的是IEEE-754标准
有些浮点数是完全精确的,例如 1.0 2.5 3.25
另外Java和C#在标准库中都有decimal类型,和一般的精确到n位的实数是一样的
7.77 == 7.77也是正确的
但是
double a
a == 7.77
就是错误的了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表