很难解释这个问题,我想将一个双数转换为整数而不用舍入小数点后的值。 例如
double a = 123.456
我想转换成
int b = 123456
我想知道有多少位数,并在计算成123.456
后将其移回
PS:我只想要纯粹的数学方法来解决这个问题,而不用计算它的特性。
答案 0 :(得分:12)
抱歉,您的问题无法解决,因为数字123.456 不存在为双倍。它舍入到123.4560000000000030695446184836328029632568359375,删除小数点后,这个数字显然不适合任何整数类型。
如果您希望123.456被视为确切的数字123.456,那么唯一的远程简单方法是将其转换为字符串并从字符串中删除小数点。这可以通过类似
的方式实现snprintf(buf, sizeof buf, "%.13f", 123.456);
然而,实际上计算出要打印它的地方数量是相当困难的。如果你使用太多,你最终将获得我上面显示的部分确切值。如果你使用的太少,那么显然你会放弃想要保留的地方。
答案 1 :(得分:0)
试试这个:
double a = 123.456;
int i;
char str[20];
char str2[20];
sptrintf(str,"%d",a);
for(i=0;i<strlen(str);i++)
{
if(!str[i] == '.')
{
sptrintf(str2,%c,str[i]);
}
}
int b = atoi(str2);
答案 2 :(得分:0)
我相信这样做的规范方法是
#include <math.h>
#include <stdio.h>
int main()
{
double d = 123.456;
double int_part;
double fract_part;
fract_part = modf(d, &int_part);
int i = (int)int_part*1000 + (int)(fract_part*1000);
printf("%d", i);
}
其中,文字1000是一个常数,用于确定所需小数的数量。
答案 3 :(得分:0)
如果您有文本"123.456"
,则只需删除小数点并将生成的文本表示转换为整数值。如果您已将文本转换为浮点值(double a = 123.456;
),则所有投注都将关闭:浮点值没有预设的小数位数,因为它表示为二进制分数。它有点像1/3而不是普通用途的.3333:它们没有相同的值,即使我们通常假装.3333意味着1/3。
答案 4 :(得分:-1)
每次将原始值乘以 10 ^ i ,每次 i 增加,直到 abs(值' - abs(value'))&lt; epsilon 对于一个非常小的epsilon。 value'应该每次从原始计算,例如
value' = value * pow(10, i)
if ( abs(value' - abs(value')) < epsilon ) then stop
最初我建议你应该简单地乘以10,但是正如R ..建议的那样,每次数值误差都会累积。因此,您可能会得到例如123.456999表示由于浮点数学而导致epsilon = .0000001而不是123.456000。
请注意,您可能会以这种方式超出int类型边界,并且可能也希望处理无穷大值。
正如Ignacio Vazquez-Abrams所说,这可能会导致您想要将123.500转换为123500的情况出现问题。您可以先通过添加一个非常小的值来解决它(它应该小于epsilon)。添加这样的值可能会导致数字错误。