84669 orang belajar
152542 orang belajar
20005 orang belajar
5487 orang belajar
7821 orang belajar
359900 orang belajar
3350 orang belajar
180660 orang belajar
48569 orang belajar
18603 orang belajar
40936 orang belajar
1549 orang belajar
1183 orang belajar
32909 orang belajar
我自己编写那个摄氏转华氏的计算如下:
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
一样.