我试图将一个双重247.32
的小数部分转换为int 32
。我只需要两位小数。我可以在C中将0.16,0.32等转换为一个整数(16,32等)吗?
我可以投双int和减去双获得.32000
我可以再乘以100,得到32.000
但后来当我尝试施放该32.000
为int
,它变成31
。
我可以解决这个问题吗? 我应该使用不同于double的数据类型来存储该数字吗?
感谢
我试图将一个双重247.32
的小数部分转换为int 32
。我只需要两位小数。我可以在C中将0.16,0.32等转换为一个整数(16,32等)吗?
我可以投双int和减去双获得.32000
我可以再乘以100,得到32.000
但后来当我尝试施放该32.000
为int
,它变成31
。
我可以解决这个问题吗? 我应该使用不同于double的数据类型来存储该数字吗?
感谢
这个问题(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/100单位的整数。但是,如果目标是将任意输入四舍五入到最接近的1/100单位数,那么算法将失败两个1/100单位之间几乎恰好中间的拐角情况,因为乘以100.0是不准确的,因此会导致双倍四舍五入发生。 – 2013-02-20 03:43:19
当然,如果输入的整数部分大于4位宽,乘以100.0将是精确的,所以这是算法工作的另一种情况。 – 2013-02-20 03:45:43
既然你只找2位小数,这对我的作品:
double a = 247.32;
int b = (int) (a * 100)%100;
printf ("%d\n", b);
更新:请参阅下面我的意见。
谢谢。这最终也为我工作。我正在从'int'版本中减去'double',然后乘以100.然后最后我将转换为int。 0.16会变成15,0.32会变成31等。 – nzondlo 2013-02-20 01:00:13
当我尝试时,会打印'31'。从'double'到'int'的转换截断和'247.32'不能完全表示。 – 2013-02-20 01:19:13
这不起作用。 – 2013-02-20 01:41:34
给定的输入值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;
顺便说一句,如果你的问题涉及到钱,不要用浮点钱!使用以美分为单位的整数或任何您货币的最小单位。
你有小数位数吗?你可以截断一个子串,然后将字符串转换为一个int? – Taz 2013-02-20 00:51:00
我只是在寻找两个实际上 – nzondlo 2013-02-20 00:54:03
如果它总是2位小数,你可以从最后2位数字子串。否则,你可能需要找到'.',然后找到子字符串2。然而,我不太了解C语法,所以实际上为你写了一个答案。 :) – Taz 2013-02-20 00:55:38