我正在为我的C ++类创建一个更改计数器程序。我们使用的数字是万亿分之一,我想知道是否有一种简单的方法将其存储到浮点类型变量中,然后将其转换为整数类型。它不是一个整数字面值,它被接受为输入,我希望可能发生变化。
答案 0 :(得分:3)
不要使用花车。将其保留为整数并使用64位长。使用“long long”或“int64_t”作为存储这些整数的类型。后者可以由#include <stdint.h>
int main()
{
long long x = 1450000000000LL;
printf("x == %lld\n", x);
return 0;
}
答案 1 :(得分:0)
嗯。不:D
但是,您可以使用矩阵和写函数来进行需要使用的数学运算。如果您正在做很多事情或使用非常大的数字进行算术运算,请查看http://gmplib.org/
答案 2 :(得分:0)
如果您使用浮点数学代表您的更改计数器,您将遇到严重的麻烦。为什么? - 您是准确性问题的受害者,导致代表值在1s,10s和100s之间不同的问题等等,直到(IIRC)10 ^ 6的值。 (假设你指的是'trillion'一词的10 ^ 12版本。如果你想更深入地了解这一点,请参阅H. Schmidt的IEEE 754 Converter page和Wikipedia article about this。
因此,如果你需要一个高于几百万的精度(我假设你这样做),如果你使用像浮点这样的野兽,你真的会遇到热水。你真的需要像(multiple precision library from GNU这样的东西来计算数字。当然你可以自己实现相同的功能。
在你的情况下,一个64位整数可以做到这一点。 (请注意,long long并不总是64位且C89是非标准的)只需通过执行类似的操作来解析用户输入(未经测试,只是为了说明这个想法):
const char input[] = "14.5"
uint64_t result = 0;
uint64_t multiplier = 1000000000000;
unsigned int i = 0;
/* First convert the integer part of the number of your input value.
Could also be done by a library function like strtol or something
like that */
while ((input[i] != '.')
&& (input[i] != '\0'))
{
/* shift the current value by 1 decimal magnitude and add the new 10^0 */
result = (result * 10) + (input[i] - '0');
i++;
}
/* Skip the decimal point */
if (input[i] == '.')
{
i++;
}
/* Add the sub trillions */
while (input[i] != '\0')
{
/* shift the current value by 1 decimal magnitude and add the new 10^0 */
result = (result * 10) + (input[i] - '0');
multiplier /= 10; // as this is just another fraction we have added,
// we reduce the multiplier...
i++:
}
result = result * multiplier;
当然有几个例外需要单独处理,如结果溢出或正确处理非数字字符,但正如我上面提到的,代码只是为了说明这个想法。
P.S:如果是有符号整数,你当然也必须处理负号。