我们在进行运算的时候,常常最终的结果是以浮点型的结果表示,float或者double等都有可能。
可是我们有时得到的结果却只是一个有限位数的小数,比如2.5,我们并不希望最终输出一个2.5000000的结果,所以在这里,我们需要去掉浮点型末尾无效的0。
可能你会说,用%.2f之类的表达输出就可以;可是你仔细想一想,这样真的可行么,对于结果是两位小数可行,但是如果结果是一个三四位的小数,你就省去了后面有效的数字。我们得到的结果是什么样的我们常常不知道,或者说有多种情况,有时只需要一位,有时需要三位。
这才是,我们为什么需要一个通用的办法去处理这样的情形的原因。
首先,我们假定一个值,比如7,表示如果结果是无限小数,我们最多保留到7位就可以了。同时,假定我们的所有数运算都是double,也就是输出需要使用“%lf”。
从而,得到如下的代码:
可是我们有时得到的结果却只是一个有限位数的小数,比如2.5,我们并不希望最终输出一个2.5000000的结果,所以在这里,我们需要去掉浮点型末尾无效的0。
可能你会说,用%.2f之类的表达输出就可以;可是你仔细想一想,这样真的可行么,对于结果是两位小数可行,但是如果结果是一个三四位的小数,你就省去了后面有效的数字。我们得到的结果是什么样的我们常常不知道,或者说有多种情况,有时只需要一位,有时需要三位。
这才是,我们为什么需要一个通用的办法去处理这样的情形的原因。
首先,我们假定一个值,比如7,表示如果结果是无限小数,我们最多保留到7位就可以了。同时,假定我们的所有数运算都是double,也就是输出需要使用“%lf”。
从而,得到如下的代码:
key = sum[i];
for (j=0;j<=7;j++)
{
if (abs((int)(key) - key) < 0.0000001)
{
p = j;
break;
}
key = key * 10;
}
printf("%d %.*lf\n", i, p, sum[i]);
7这个数,就是我们设定的最多保留到7位小数。
sum[i]是当前我们要输出的结果。
可以发现,我们不断地去判断sum[i],直到发现当它乘以p个10之后得到的数,与其取整的数,之间相差小于一个阈值,比如0.0000001,表示此事我们得到了p就是其小数的位数。(因为乘以p个10可以把它变成一个整数)
然后再输出的时候,利用*作为占位符,“%.*lf”中表明*的位置对应一个变量,编译器会自动寻找后面接的变量名中,相应位置的变量,在上面的语句中,就是p对应了*,从而输出p位小数。
如此,我们就实现了自动去掉小数末尾无效的0的结果。
sum[i]是当前我们要输出的结果。
可以发现,我们不断地去判断sum[i],直到发现当它乘以p个10之后得到的数,与其取整的数,之间相差小于一个阈值,比如0.0000001,表示此事我们得到了p就是其小数的位数。(因为乘以p个10可以把它变成一个整数)
然后再输出的时候,利用*作为占位符,“%.*lf”中表明*的位置对应一个变量,编译器会自动寻找后面接的变量名中,相应位置的变量,在上面的语句中,就是p对应了*,从而输出p位小数。
如此,我们就实现了自动去掉小数末尾无效的0的结果。