数学将浮点数舍入到小数点后N位

时间:2018-10-07 07:57:35

标签: c++ c codeblocks

我想将浮点数/双精度数四舍五入到小数点后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。我想念什么?

3 个答案:

答案 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/21/41/8等)。您会发现0.1的表示形式涉及一个无穷小数列。原因类似于以下事实:分数1/3不能用有限的小数位数表示(即0.33333....永远重复的3)。

无理数(例如sqrt(2.0)pi等)也不能用有限数量的数字精确表示。因此,不可能设计固定大小和有限大小的浮点类型来精确地容纳这些值。