我自己编写那个摄氏转华氏的计算如下:
nclude<stdio.h> void main() { float c, f; printf("Please enter a C: \n"); scanf("%f",&c); f = 1.8*c + 32; printf("F is:%f",f); }
但是,当我输入25.8时,结果给的是78.440002% 想问一下,为什么会多出来最后那个0002和最后的%。?
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
主要的问题是计算机使用的是二进制表示数据:
二进制的 0.1 是十进制的 0.5 0.1 <=> 0.5 0.01 <=> 0.25 0.001 <=> 0.125 .....
但是当我们表示十进制的 0.8的时候就出了问题0.8 = 0.5 + 0.25 + 0.03125 + 0.01526 + ... 所以表示成二进制是0.11001100... 这个是无限长的。但是计算机只能表示成有限长的,比如是 0.110011 这个有限的二进制再转换成我们习惯的十进制时就是 0.796875,也就是说我们想保存0.8 但是其实计算机保存的是0.796875(计算机可能保存的二进制数据更长,也只不过是更精确罢了),所以就出现了你代码中的情况。
0.8 = 0.5 + 0.25 + 0.03125 + 0.01526 + ...
0.11001100...
0.110011
0.796875
解决的方法就是不要输出计算结果取个近似就好了,如果你需要更大的精度就用更大精度的浮点数。 你需要记住的的是计算机保存浮点数的时候是不精确的就好了。
printf 不指定小数点长度 , f% 默认显示整数部分和6位小数 要更精确 可以使用 lf
题主需要了解下有关浮点数的基础知识,这篇文章解释的比较好http://cenalulu.github.io/linux/about-denormalized-float-number/
大部分浮点数在计算机中不能精确表示 可以参考java中的BigDecimal类用定点数表示
float类型都有默认的精度,一般不能精确表示某个数值
我运行了你的程序, 输出结果中的末尾是没有%的. 我猜那是你的命令行提示符吧. 正如我的F is:78.440002MacAir~/Temp $中的MacAir一样.
%
F is:78.440002MacAir~/Temp $
MacAir
主要的问题是计算机使用的是二进制表示数据:
但是当我们表示十进制的 0.8的时候就出了问题
0.8 = 0.5 + 0.25 + 0.03125 + 0.01526 + ...
所以表示成二进制是0.11001100...
这个是无限长的。但是计算机只能表示成有限长的,比如是0.110011
这个有限的二进制再转换成我们习惯的十进制时就是0.796875
,也就是说我们想保存0.8 但是其实计算机保存的是0.796875(计算机可能保存的二进制数据更长,也只不过是更精确罢了),所以就出现了你代码中的情况。解决的方法就是不要输出计算结果取个近似就好了,如果你需要更大的精度就用更大精度的浮点数。
你需要记住的的是计算机保存浮点数的时候是不精确的就好了。
printf 不指定小数点长度 , f% 默认显示整数部分和6位小数
要更精确 可以使用 lf
题主需要了解下有关浮点数的基础知识,这篇文章解释的比较好http://cenalulu.github.io/linux/about-denormalized-float-number/
大部分浮点数在计算机中不能精确表示 可以参考java中的BigDecimal类用定点数表示
float类型都有默认的精度,一般不能精确表示某个数值
我运行了你的程序, 输出结果中的末尾是没有
%
的. 我猜那是你的命令行提示符吧.正如我的
F is:78.440002MacAir~/Temp $
中的MacAir
一样.