我想将浮点数/双精度数四舍五入到小数点后n位。但不是印刷,而是一般。
例如:用户的输入为:2.3891 3,因此输出应为2.389
或如果用户输入5.98441 4,则输出应为:5.9844
#include <stdio.h>
#include <math.h>
int main () {
float num;
int decimals;
scanf("%f%d", &num, &decimals); //5.2381 2
int res = num; // res = 5
int power = 1;
int i = 0;
for(i = 0; i < decimals; i++)
power*=10; // 1 * 10 * 10
int num3 = num * power; // num3 = 523
int num2 = num3 % power;//
float a = num2*1.0 / power*1.0;
// float a = 23*1.0/13.0;
printf("%f %d\n", a, power);
a = res + a;
printf("%f", a);
return 0;
}
作为这里的输出,我得到:2.390000。我不想使用这些零,也不想使用固定的%.2f。我想念什么?
答案 0 :(得分:2)
通常,此任务是不可能的,因为IEEE 754转换是二进制浮点数或双精度浮点数的表示形式。因此,高行scanf("%f%d", &num, &decimals); //5.2381 2
确实将十进制数(以10为基数)转换为二进制浮点数,并且由于只有有限的位数,因此这种转换一般不作废。
您可以减少位数(二进制),但这在十进制系统中未定义。
打印浮点(双精度)精度数字时,由于将二进制转换为十进制浮点计算,因此还有第二种精度。
答案 1 :(得分:1)
您要在这里做两件事:1)计算一个数字的舍入值,以及2)打印该数字。
您几乎可以正确执行此操作。请注意,在将float
隐式转换为int
时,C会截断而不是舍入,因此:
float f = 1.9;
int i = f;
将i
设置为1
,而不是2
。在您的情况下,如果输入为“ 1.229 2”,则您正在计算的值为1.22,而不是1.23。这可能是您想要的,但可能不是。如果您想将舍入而不是将舍入为零,则可能需要更改以下内容:
int num3 = num * power;
收件人:
int num3 = 0.5 + num * power;
一旦计算出值,就在打印它。如果只想打印四舍五入到的小数位数,可以使用printf()
的精度字段,如下所示:
printf("%.*f\n", decimals, a);
答案 2 :(得分:0)
通常,这是不可能的。 C和C ++中的浮点最终是根据基数,尾数,符号和指数指定的。
十进制浮点为10。在现代硬件中,实践中极为罕见。一些早期的计算硬件(例如1946年创建的ENIAC)支持十进制浮点数。但是,这种表示在现代硬件中非常罕见。
现代硬件上最常见的浮点表示形式使用2
(即二进制)为基础。二进制浮点不能代表所有十进制小数。尝试使用0.1
的负幂之和表示十进制值2
(例如1/2
,1/4
,1/8
等)。您会发现0.1
的表示形式涉及一个无穷小数列。原因类似于以下事实:分数1/3
不能用有限的小数位数表示(即0.33333....
永远重复的3
)。
无理数(例如sqrt(2.0)
,pi
等)也不能用有限数量的数字精确表示。因此,不可能设计固定大小和有限大小的浮点类型来精确地容纳这些值。