![](https://iknow-base.cdn.bcebos.com/lxb/notice.png)
如何用c语言计算小数点后位数(float本身都无法精确)
#include"stdio.h"#include"conio.h"voidmain()/*计算小数点后位数*/{floatnumber=100.25432;inttem...
#include "stdio.h"
#include "conio.h"
void main() /*计算小数点后位数*/
{
float number=100.25432;
int temp;
int dot_loc=0;
temp=(int)number;
while(number-temp>0)
{
number=number*10;
temp=(int)number;
dot_loc++;
printf("%f\n",number-temp);
getch();
}
printf("digits after decimal point: %d\n",dot_loc);
getch();
}
由于浮点数本身就不精确,在存数的时候就会存成100.25432130xxx,他并不能精确的表达小数,那我应该怎么求小数点后位数呢。 展开
#include "conio.h"
void main() /*计算小数点后位数*/
{
float number=100.25432;
int temp;
int dot_loc=0;
temp=(int)number;
while(number-temp>0)
{
number=number*10;
temp=(int)number;
dot_loc++;
printf("%f\n",number-temp);
getch();
}
printf("digits after decimal point: %d\n",dot_loc);
getch();
}
由于浮点数本身就不精确,在存数的时候就会存成100.25432130xxx,他并不能精确的表达小数,那我应该怎么求小数点后位数呢。 展开
7个回答
展开全部
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 就可以了。
你可以用字符串来输入和存放。
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 就可以了。
追问
这个不在考虑范围内,我早就想到了
追答
哦,用字符串存放 不在考虑范围。
那么用2个整型数来分别存放整数部分和小数部分,肯定也想到了,也不在考虑范围内了。
那么估计就没办法了。
因为这不单单是存放长度问题,而是 10进制变2进制,一般的数都化不净。
就像 1.0/3.0 就是 0.33333...3333, 就算是取100位,第101位后就被截断了。就算用 double,
long double 存放,还是要被截断。
C99 新引入的 16进制指数形式(例如:0xb.1ep5 这种形式)也帮助不了10进制变2进制截断误差问题。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
C语言没有库函数来处理这类问题,你必须自己写函数处理。。。
在java中,有个效率低下的BigDecimal类来处理这个问题,这个类直接把字符串转化成数字的,你可以参考下。。。
在java中,有个效率低下的BigDecimal类来处理这个问题,这个类直接把字符串转化成数字的,你可以参考下。。。
追问
我也听说过java中有个BigDecimal,但是我没学过java,so不会~,就是不会写这个函数所以才拜托各位大神呢
不过你能懂我的意思,并且还热心回答了,虽然对我解决问题没有太大帮助,要是没有别人回答的话,我就采纳你的了
追答
用到小数时,用两个int做分母和分子,储存时回避小数问题,保留精确结果。需要得到小数结果的时候,用位移和与或非处理这两个int(具体参考cpu数值运算原理),得到精确的小数结果。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
C语言本身并不提供高精度的小数运算,如果需要,可以查找一下数值计算方面的资料,不同的应用场景有不同的算法来计算
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询