#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,他并不能精确的表达小数,那我应该怎么求小数点后位数呢。
是这样的。
这个不在考虑范围内,我早就想到了
追答哦,用字符串存放 不在考虑范围。
那么用2个整型数来分别存放整数部分和小数部分,肯定也想到了,也不在考虑范围内了。
那么估计就没办法了。
因为这不单单是存放长度问题,而是 10进制变2进制,一般的数都化不净。
就像 1.0/3.0 就是 0.33333...3333, 就算是取100位,第101位后就被截断了。就算用 double,
long double 存放,还是要被截断。
C99 新引入的 16进制指数形式(例如:0xb.1ep5 这种形式)也帮助不了10进制变2进制截断误差问题。
我也听说过java中有个BigDecimal,但是我没学过java,so不会~,就是不会写这个函数所以才拜托各位大神呢
不过你能懂我的意思,并且还热心回答了,虽然对我解决问题没有太大帮助,要是没有别人回答的话,我就采纳你的了
用到小数时,用两个int做分母和分子,储存时回避小数问题,保留精确结果。需要得到小数结果的时候,用位移和与或非处理这两个int(具体参考cpu数值运算原理),得到精确的小数结果。