c++ - float类型精度问题
高洛峰
高洛峰 2017-04-17 11:53:23
0
6
373

我自己编写那个摄氏转华氏的计算如下:

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教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回覆(6)
伊谢尔伦

主要的問題是電腦使用的是二進位表示資料:

二进制的 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(計算機可能保存的二進位資料更長,也只不過是更精確罷了),所以就出現了你程式碼中的情況。

解決的方法就是不要輸出計算結果取個近似就好了,如果你需要更大的精度就用更大精度的浮點數。
你要記住的是計算機保存浮點數的時候是不精確的就好了。

Peter_Zhu

printf 不指定小數點長度 , f% 預設顯示整數部分和6位小數
要更精確 可以使用 lf

Peter_Zhu

題主需要了解下有關浮點數的基礎知識,這篇文章解釋的比較好http://cenalulu.github.io/linux/about-denormalized-float-number/

Peter_Zhu

大部分浮點數在計算機中不能精確表示 可以參考java中的BigDecimal類別用定點數表示

左手右手慢动作

float類型都有預設的精確度,一般不能精確表示某個數值

迷茫

我運行了你的程式, 輸出結果中的末尾是沒有%的. 我猜那是你的命令行提示符吧.
如我的F is:78.440002MacAir~/Temp $中的MacAir一樣.

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!