如何用c语言计算小数点后位数(float本身都无法精确) 如何用c语言计算小数点后位数

\u5982\u4f55\u7528c\u8bed\u8a00\u8ba1\u7b97\u5c0f\u6570\u70b9\u540e\u4f4d\u6570\uff08float\u672c\u8eab\u90fd\u65e0\u6cd5\u7cbe\u786e\uff09

#include
void
main()
{
float
f;
double
c;
//\u7ed3\u679c\u6700\u597d\u5b9a\u4e49\u4e3adouble\u578b,\u8fd0\u7b97\u65f6\u6700\u540e\u7684\u7ed3\u679c\u53ef\u80fd\u4f1a\u8f6c\u4e3adouble\u578b
printf("\u8f93\u5165\u534e\u6c0f\u6e29\u5ea6:");
scanf("%f",&f);
//\u7528\u4e8e\u63a5\u53d7\u952e\u76d8\u8f93\u5165\u7684\u6570
c=(f-32)/1.8;
//\u8ba1\u7b97
printf("c=%lf",c);//\u8f93\u51fa\u7ed3\u679c
}
//\u5982\u679c\u8981\u5faa\u73af\u8f93\u5165\u53ef\u7528\u5faa\u73af\u5d4c\u5957\u8d77\u6765,\u5e76\u4f7f\u7528\u6761\u4ef6\u5f53\u4f60\u8f93\u5165\u7279\u5b9a\u503c\u65f6\u9000\u51fa

\u8fd9\u4e2a\u8981\u770b\u5c0f\u6570\u6309\u4ec0\u4e48\u683c\u5f0f\u8f93\u5165\u3002
\u5982\u679c\u6309%s\u8f93\u5165\uff0c\u4e5f\u5c31\u662f\u6309\u5b57\u7b26\u4e32\u683c\u5f0f\u8f93\u5165\uff0c\u5148\u627e\u5230\u5c0f\u6570\u70b9\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u7edf\u8ba1\u4e0b\u5c0f\u6570\u70b9\u540e\u6570\u5b57\u7684\u957f\u5ea6\u3002
\u5177\u4f53\u5b9e\u73b0\u53ef\u53c2\u8003\uff1a
#include #include #include int main(int argc, char* argv[]){ char a[128]; while(scanf("%s",a)!=EOF) { if(strstr(a,".")!=NULL) printf("%d\n",strlen(strstr(a,".")+1)); else printf("0\n"); } system("pause"); return 0; }
\u5982\u679c\u6309%f\uff08\u5bf9\u5e94float\u7c7b\u578b\u5c0f\u6570\uff09\u6216\u8005%lf\uff08double\u7c7b\u578b\u7684\u5c0f\u6570\uff09\u65b9\u5f0f\u8bfb\u5165\uff0c\u5219\u9700\u8981\u5148\u53bb\u6389\u6574\u6570\u90e8\u5206\uff0c\u7136\u540e\u770b\u5c0f\u6570\u90e8\u5206\u4e00\u76f4\u4e5810\u51cf\u53bb\u6574\u6570\u90e8\u5206\uff0c\u77e5\u9053\u7b49\u4e8e0\uff0c\u7edf\u8ba1,\u4e58\u4e86\u51e0\u6b2110\uff0c\u4f46\u662f\u7531\u4e8e\u6d6e\u70b9\u6570\u5728\u8ba1\u7b97\u673a\u4e2d\u5b58\u7684\u5e76\u4e0d\u662f\u51c6\u786e\u503c\uff0c\u8fd9\u4e2a\u5f80\u5f80\u5f97\u4e0d\u5230\u6b63\u786e\u7684\u7ed3\u679c\u3002\u53ef\u4ee5\u4f7f\u7528sprintf(str,"%g",f);\uff0c\u7136\u540e\u7531\u4e8ef\u6bd5\u7adf\u4e0d\u662f\u51c6\u786e\u503c\uff0c\u8fd8\u662f\u4f1a\u51fa\u73b0\u6709\u4e9b\u95ee\u9898\uff0c\u6e90\u7801\u5982\u4e0b\uff1a
#include #include #include int main(int argc, char* argv[]){ char a[128]; float f; while(scanf("%f",&f)!=EOF) { sprintf(a,"%g",f); if(strstr(a,".")!=NULL) printf("%d\n",strlen(strstr(a,".")+1)); else printf("0\n"); } system("pause"); return 0; }
\u8fd9\u662f\u6700\u540e\u4e00\u4e2a\u5df2\u7ecf\u51fa\u73b0\u9519\u8bef\uff0c\u6240\u4ee5\u9047\u5230\u8981\u7cbe\u786e\u5224\u65ad\u5c0f\u6570\u70b9\u7684\u4f4d\u6570\uff0c\u6700\u597d\u76f4\u63a5\u6309\u5b57\u7b26\u4e32\u8bfb\u5165\uff0c\u8fd9\u548c\u56fe\u7075\u673a\u7684\u5de5\u4f5c\u539f\u7406\u6697\u6697\u76f8\u5408\u3002

float以10进制只有7个有效数字,如果你存的数大于7位那么一定会不准确,小于7位的就准确,其实float只有前7位有意义,有时会只有6位有意义。。。 也就是说你只用用7-整数位数就行,如果整数位为0,那么你只需要7+第一个不是0的小数所在位置即可,即此时小树位数是大于7的,但有效数字个数仍然是7。。。。

100.25432 是十进制数,存入float 要先化成2进制float格式,十进制化二进制,通常化不净,于是就引入了截断误差,以至于,只有6-7位有效数字精度了。

你可以用字符串来输入和存放。
char s[30]="100.25432";
int L,k,i,n;
L = strlen(s); // 计算字符串长度, 得 9
for (i=0;i<L;i++) if (s[i]=='.') { k=i; break;}; // 找出小数点在哪里, 得 3
n = L - k - 1; // 小数点后的位数,得 5
-----
如果输入,前面添输入语句:
printf("please input 100.25432\n");
scanf("%s",s); // 读入 100.25432
接下来同样计算 L,k,n 就可以了。

C语言没有库函数来处理这类问题,你必须自己写函数处理。。。
在java中,有个效率低下的BigDecimal类来处理这个问题,这个类直接把字符串转化成数字的,你可以参考下。。。

1、先把浮点数变成字符串,再通过小数点确定小点后面的位数。

2、例程:

#include <stdio.h>
#include <string.h>
void main()  {
    char * ptr;
    char strFloat[20];
    float number=100.25432;
    sprintf(strFloat, "%f", number);
    ptr = strstr(strFloat, ".");
    if (ptr != NULL) {
        printf("digits after decimal point: %d
", strlen(ptr) - 1);
    }
}


C语言本身并不提供高精度的小数运算,如果需要,可以查找一下数值计算方面的资料,不同的应用场景有不同的算法来计算

  • 濡備綍鐢╟璇█璁$畻灏忔暟鐐瑰悗浣嶆暟(float鏈韩閮芥棤娉曠簿纭)
    绛旓細1銆佸厛鎶婃诞鐐规暟鍙樻垚瀛楃涓诧紝鍐嶉氳繃灏忔暟鐐圭‘瀹氬皬鐐瑰悗闈㈢殑浣嶆暟銆2銆佷緥绋嬶細include <stdio.h>#include <string.h>void main() { char * ptr; char strFloat[20]; float number=100.25432; sprintf(strFloat, "%f", number); ptr = strstr(strFloat, "."); if (ptr != ...
  • 濡備綍鐢╟璇█璁$畻灏忔暟鐐瑰悗浣嶆暟
    绛旓細濡傛灉鎸%f锛堝搴攆loat绫诲瀷灏忔暟锛夋垨鑰%lf锛坉ouble绫诲瀷鐨勫皬鏁帮級鏂瑰紡璇诲叆锛屽垯闇瑕佸厛鍘绘帀鏁存暟閮ㄥ垎锛岀劧鍚庣湅灏忔暟閮ㄥ垎涓鐩翠箻10鍑忓幓鏁存暟閮ㄥ垎锛岀煡閬撶瓑浜0锛岀粺璁,涔樹簡鍑犳10锛屼絾鏄敱浜庢诞鐐规暟鍦璁$畻鏈轰腑瀛樼殑骞朵笉鏄噯纭硷紝杩欎釜寰寰寰椾笉鍒版纭殑缁撴灉銆傚彲浠ヤ娇鐢╯printf(str,"%g",f);锛岀劧鍚庣敱浜巉姣曠珶涓嶆槸鍑嗙‘鍊硷紝杩樻槸...
  • C璇█涓緭鍑烘椂鎬庢牱鎺у埗灏忔暟鐐瑰悗鐨浣嶆暟,璇蜂妇渚嬭鏄庝繚鐣1銆2銆3銆4...
    绛旓細鍦C璇█涓紝鎺у埗灏忔暟鐐瑰悗鐨浣嶆暟閫氳繃printf鍑芥暟涓殑鏍煎紡璇存槑绗﹀疄鐜般備互淇濈暀1銆2銆3銆4浣嶅皬鏁颁负渚嬶紝浣犲彲浠ヨ繖鏍锋搷浣滐細1. 褰撲綘鎯充繚鐣1浣嶅皬鏁帮紝渚嬪float绫诲瀷鐨勫彉閲廸锛屽彲浠ヤ娇鐢╜printf("%.1f", f);`锛岃繖浼氳嚜鍔ㄥ洓鑸嶄簲鍏ュ苟鍙樉绀轰竴浣嶅皬鏁般2. 淇濈暀2浣嶅皬鏁版椂锛岀敤`printf("%.2f", f);`锛屽皬鏁扮偣...
  • c璇█涓殑鏁村瀷鏁板瓧鎬庝箞姹傚皬鏁扮偣鍚鐨浣嶆暟
    绛旓細涓や釜澶т簬鍙蜂负鍚戝彸绉讳綅锛屽悓鐞嗭紝涓や釜灏忎簬鍙蜂负浜岃繘鍒跺悜宸︾Щ浣嶃傦紙鍗充箻浠ュ灏戞垨闄や互澶氬皯锛変緥濡傦細int main(){ int a = 16;cout<<(a<<4)<<endl;cout<<(a>>4)<<endl;//浣嗘槸a鐨勫煎苟娌℃湁鏀瑰彉 a >>= 1;//姝ゆ椂a鐨勫兼敼鍙樹簡 cout<<a<<endl;cin>>a;return 0;} 杈撳叆鐨勭粨鏋滃垎鍒负256,1锛...
  • 鐢–璇█姹涓涓暟鐨灏忔暟鐐瑰悗绗嚑浣嶆暟鏄灏,绋嬪簭灏介噺鏃堕棿澶嶆潅搴﹀皬鐐筥鐧 ...
    绛旓細鍒濆C锛屾濂界湅鍒版棰橈紝鍛靛懙锛屽氨鐢ㄦ渶鍘熷鐨勬柟娉曠粰鍐欎竴涓嬪惂#include"stdio.h"include"math.h"main(){double n;int m,i;printf("璇疯緭鍏ヤ竴涓暟鍙婅姹傜殑灏忔暟鐐瑰悗绗嚑浣嶏紙绌烘牸閿殧寮锛夛細\n");scanf("%lf%d",&n,&i);m=n;//杞崲涓烘暣鍨 n-=m;n*=pow(10,i);m=n;//杞崲涓烘暣鍨 printf(...
  • C璇█灏忔暟鐐规庝箞绮剧‘鍒板悗鑻ュ共浣
    绛旓細鍙互鍦ㄨ緭鍑烘椂锛屾寚瀹灏忔暟鐐瑰悗鐨勬湁鏁浣嶆暟锛屽疄鐜扮簿纭埌鑻ュ共浣嶇殑鏁堟灉銆傝绮剧‘鍒板皬鏁扮偣鍚庤嫢骞蹭綅锛屽垯鏁版嵁绫诲瀷涓烘诞鐐瑰瀷锛屽彲鑳戒负鍗曠簿搴(float)鎴栧弻绮惧害(double)銆傚湪C璇█涓紝浣跨敤鏍煎紡鍖栬緭鍑哄嚱鏁皃rintf鏉ュ疄鐜拌緭鍑恒傝緭鍑烘牸寮忎负%.NF1 %涓烘牸寮忓寲瀛楃涓茬殑寮曞瀛楃銆2 .N琛ㄧず鎸囧畾鏄剧ずN浣嶅皬鏁般3 F涓虹被鍨嬪瓧绗︼紝瀵逛簬...
  • C璇█涓緭鍑烘椂鎬庢牱鎺у埗灏忔暟鐐瑰悗鐨浣嶆暟,璇蜂妇渚嬭鏄庝繚鐣1銆2銆3銆4...
    绛旓細鍦–鐨勭紪绋嬩腑锛屾讳細閬囧埌娴偣鏁扮殑澶勭悊锛屾湁鐨勬椂鍊欙紝鎴戜滑鍙渶瑕佷繚鐣2浣嶅皬鏁颁綔涓鸿緭鍑虹殑缁撴灉锛岃繖鏃跺欙紝闂鏉ヤ簡锛屾庢牱鎵嶈兘璁ヽout杈撳嚭鎸囧畾鐨灏忔暟鐐瑰悗淇濈暀浣嶆暟鍛紵鍦C璇█鐨勭紪绋嬩腑锛屾垜浠彲浠ヨ繖鏍峰疄鐜板畠锛歔cpp] view plain copy printf("%.2f", sample);鍦–++涓紝鏄病鏈夋牸寮忕鐨勶紝鎴戜滑鍙互閫氳繃浣跨敤setprecision...
  • 濡備綍鐢╟璇█杈撳叆灏忔暟鐐瑰悗100浣嶄互鍚庣殑鏁般
    绛旓細select convert(numeric(8,2) ,cast( (select convert(Numeric(8,2),( select COUNT(*) from 琛 where 鍒1=1229)) / (select count(鍒1) from 琛))) * 100 as varchar(10) ) + '%'娉細*100 as varchar(10))+'%' (10) 鍙樻垚闀垮害鏄10鐨勫瓧绗︿覆锛岀劧鍚庡啀鍔犱笂%鍙凤紝濡傛灉涓嶇敤鍔%...
  • C璇█涓緭鍑烘椂鎬庢牱鎺у埗灏忔暟鐐瑰悗鐨浣嶆暟,璇蜂妇渚嬭鏄庝繚鐣1銆2銆3銆4...
    绛旓細鎺у埗灏忔暟浣嶆暟灏辨槸閫氳繃杈撳嚭鏍煎紡璇存槑绗︽潵瑙勫畾鐨 涓句緥璇存槑濡備笅锛1銆乫loat f1=3.1415926;2銆乫loat f2=1234.1415926;3銆乫loat f3=124.1;4銆乸rintf("%3.4f",f1);//杈撳嚭缁撴灉涓猴細_ _ 3.1416(_琛ㄧず绌烘牸)5銆乸rintf("%3.4f",f2);//杈撳嚭缁撴灉涓猴細1234.1416 6銆乸rintf("%3.4f",f3);//杈撳嚭缁撴灉...
  • 鎬庝箞浣跨敤C璇█璁╄緭鍑虹殑鏁版槸灏忔暟鐐瑰悗鐨勬暟瀛
    绛旓細鍒╃敤C璇█浣胯緭鍑哄间负灏忔暟鐨勭紪绋嬫柟娉曞拰鎬濇兂濡備笅锛1.棣栧厛闇瑕佸畾涔変竴涓彉閲忎綔涓哄悗缁渶瑕佽緭鍑虹殑鏁般傝繖閲屼互瀹氫箟涓涓彉閲廰涓轰緥銆傞渶瑕佹敞鎰忕殑鏄紝鏁村瀷int鏄笉鏀寔杞寲鐨勩2.鐒跺悗浣跨敤scanf()鍑芥暟鎺ュ彈浠庨敭鐩樿緭鍏ョ殑涓涓暟锛岃繖鏍峰氨涓哄彉閲廰鎴愬姛璧嬪笺3.鎺ョ潃浣跨敤printf璇彞鏉ュ鏁癮杩涜灏忔暟鍖栫殑澶勭悊銆傚鐞嗘牸寮忎负锛氥%....
  • 扩展阅读:c++输出保留两位小数 ... c语言%lf保留几位小数 ... 批量删除小数点后位数 ... c++保留小数 ... c++控制小数点后位数 ... c语言输出小数格式 ... c语言控制小数点位数 ... c语言输出小数占八位 ... c怎么控制输出小数位数 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网