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