1

我正在尝试将 double 的小数部分转换247.32 为 int 32。我只需要两位小数。

我可以将双精度转换为 int 并从双精度中减去以获得.32000

然后我可以乘以 100 得到32.000

但是当我尝试将其转换32.000为时int,它变成了31

我可以解决这个问题吗?我应该使用不同于双精度的数据类型来存储该数字吗?

谢谢

4

3 回答 3

4

问题(skjaidev 的答案没有解决)是247.32不能用二进制浮点精确表示。实际存储的值很可能是:

247.31999999999999317878973670303821563720703125

所以你不能只丢弃整数部分,乘以 100,然后转换为int,因为转换会截断

中声明的round()函数将值<math.h>四舍五入double到最接近的整数——尽管结果仍然是类型double

double a = 247.32;
a -= trunc(a);      /* a == 0.32 -- approximately */
a *= 100.0;         /* a == 32.0 -- approximately */
a = round(a);       /* a == 32.0 -- exactly */
printf ("%d\n", (int)a);

或者,将计算放在一行中:

double a = 247.32;
printf("%d\n", (int)round(100.0 * (a - trunc(a))));

实际上,这可能是一种更清洁的方法:

double a = 247.32;
printf("%d\n", (int)round(100.0 * fmod(a, 1.0)));
于 2013-02-20T01:28:51.197 回答
2

给定输入值x和输出y

char buf[5];
snprintf(buf, sizeof buf, "%.2f", fmod(x, 1.0));
y = strtol(buf+2, 0, 10);

或者只是y = 10*(buf[2]-'0')+buf[3]-'0';为了避免strtol成本。

这是在不自己编写大量代码的情况下做你想做的事情的唯一方法,因为函数族是唯一能够执行十进制舍入的标准函数。printf

如果您有一些额外的约束,例如x非常接近 1/100 的倍数,您可能会作弊并执行以下操作:

int y = ((x+0.001)*100;

顺便说一句,如果您的问题涉及金钱,请不要使用浮点数来赚钱!使用以美分为单位的整数或任何您的货币的自然最小单位。

于 2013-02-20T01:46:20.263 回答
0

由于您只寻找 2 位小数,这对我有用:

double a = 247.32;
int b = (int) (a * 100)%100;
printf ("%d\n", b);

更新:见下面我的评论。

于 2013-02-20T00:55:09.930 回答