鱼C论坛

 找回密码
 立即注册
查看: 3493|回复: 2

不知道为什么连3/2都算不对?

[复制链接]
发表于 2013-10-10 10:07:58 | 显示全部楼层 |阅读模式
1鱼币
#include <stdio.h>]

void main()
{

        printf("%f\n",1.0/3*3);
}
得到的结果是  1.000000  为什么不是鱼c说的0.999999

#include <stdio.h>]
void main(){
        printf("%f\n",3/2);}得到的结果是 0.000000  然后改了很多组算术算出来都是这样,是不是我哪里出问题啦!

最佳答案

查看完整内容

第二个问题: 试试这样在C里,整数除以整数,只会得到整形的结果,所以你的结果一直是0 把被除数改成浮点数后,结果就是浮点数啦 至于第一个问题……我测试的也是1.000000 ,楼上说的……好复杂,我认为没必要纠结的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-10 10:07:59 | 显示全部楼层
第二个问题:
试试这样
#include <stdio.h>
void main
{
      printf("%f\n" , 3.0/2);
}
在C里,整数除以整数,只会得到整形的结果,所以你的结果一直是0
把被除数改成浮点数后,结果就是浮点数啦

至于第一个问题……我测试的也是1.000000 ,楼上说的……好复杂,我认为没必要纠结的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-10 10:29:22 | 显示全部楼层
本帖最后由 福禄娃娃 于 2013-10-10 10:30 编辑

你需要把int型的结果做一个强制转换
printf("%f\n", (float)(3 / 2));

(1) 存放:
整型数据是转换成相应的补码后直接存放在内存中,而实型与整型的存放不同,它是以指数形式存放,即符号位+小数部分+指数部分.比如:12345在内在中的存放形式是这样的:第一位符号位是’+’,接下来存放的是小数,即0.12345,最后是指数5,而小数部分和指数部分所占的位数因编译系统的不同而不同,不必深究,
(2) 转换:
所有可以转换的数据类型之间的转换都遵循一个规则:按存储单元的存储形式直接传送,从低位开始.比如:将十进制数-123转换为八进制数: 将其补码原样传送由于八进制数无符号(十六进制数也一样),所以最高位的1在八进制数的内在单元中已不代表符号,而代表数值进行运算.不同的编译器和机器所得的结果不一定相同,因为整型变量所占的字节数不同,现以十六位机(另外还与编译器有关,假如整型占两个字节)为例:-123的补码为1111111110000101,将其换算成八进制数为177605,而在32位机上(假如整形占4个字节),其结果就是37777777605.
实型转换成整型时,得到的绝不是你想要的结果,因为实型的存储形式是按指数形式存储的,低位中存储的是指数部分,当传送的时候,只是将指数部分或指数部分加上小数部分的小部分传送给整型变量,得到的结果不可能是你想要的结果.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 13:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表