我试图转换双247.32
的小数部分
到一个int 32
。我只需要两位小数。
我可以将double转换为int并从double中减去以获得.32000
然后我可以乘以100得到32.000
但是当我尝试将32.000
转换为int
时,它会变成31
。
我能解决这个问题吗? 我应该使用与double不同的数据类型来存储该数字吗?
由于
答案 0 :(得分: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)));
答案 1 :(得分: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;
顺便说一句,如果你的问题涉及金钱,不要使用浮点钱!使用以美分为单位的整数或您的货币的最小单位。
答案 2 :(得分:0)
由于你只需要2个小数位,这对我有用:
double a = 247.32;
int b = (int) (a * 100)%100;
printf ("%d\n", b);
更新:请参阅下面的评论。