2013-02-20 78 views
1

我试图将一个双重247.32 的小数部分转换为int 32。我只需要两位小数。我可以在C中将0.16,0.32等转换为一个整数(16,32等)吗?

我可以投双int和减去双获得.32000

我可以再乘以100,得到32.000

但后来当我尝试施放该32.000int,它变成31

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

感谢

+0

你有小数位数吗?你可以截断一个子串,然后将字符串转换为一个int? – Taz 2013-02-20 00:51:00

+0

我只是在寻找两个实际上 – nzondlo 2013-02-20 00:54:03

+0

如果它总是2位小数,你可以从最后2位数字子串。否则,你可能需要找到'.',然后找到子字符串2。然而,我不太了解C语法,所以实际上为你写了一个答案。 :) – Taz 2013-02-20 00:55:38

回答

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

这将工作,假设输入值是“大约”等于1/100单位的整数。但是,如果目标是将任意输入四舍五入到最接近的1/100单位数,那么算法将失败两个1/100单位之间几乎恰好中间的拐角情况,因为乘以100.0是不准确的,因此会导致双倍四舍五入发生。 – 2013-02-20 03:43:19

+0

当然,如果输入的整数部分大于4位宽,乘以100.0将是精确的,所以这是算法工作的另一种情况。 – 2013-02-20 03:45:43

0

既然你只找2位小数,这对我的作品:

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

更新:请参阅下面我的意见。

+0

谢谢。这最终也为我工作。我正在从'int'版本中减去'double',然后乘以100.然后最后我将转换为int。 0.16会变成15,0.32会变成31等。 – nzondlo 2013-02-20 01:00:13

+0

当我尝试时,会打印'31'。从'double'到'int'的转换截断和'247.32'不能完全表示。 – 2013-02-20 01:19:13

+1

这不起作用。 – 2013-02-20 01:41:34

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; 

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

相关问题