0

如标题所述,我想将一个多位双精度数拆分为多个部分,每个部分包含 4 个数字。

我已经将双精度数舍入到最接近的整数,所以没有小数部分,剩下的是一个非常长的双精度数,远远超过最大的长长整数。

我需要将整数部分拆分为几个 4 位数字部分,整数部分非常简单,这样的 while 语句就可以了:

unsigned long long int IntegerWithSeveralParts;
unsigned short int i = 0;
unsigned int Parts[10];
while ( IntegerWithSeveralParts )
{
    Parts[i] = IntegerWithSeveralParts % 10000;
    IntegerWithSeveralParts /= 10000;
    ++ i;
}

是的,我知道这些部分的顺序是相反的,但是向量可以解决这个问题。问题是,我不能对浮点数和双精度数执行模块化,这对我来说很重要。我可以将它们转换为字符串,然后从中进行拆分,但这非常耗时,因为这将包括流的使用。

还有其他方法吗?

4

4 回答 4

3

您总是可以通过乘以 10000 然后调制 10000 将小数部分“提升”为整数。这将取前四位小数并从中生成一个整数。重复执行此操作以获得更多的 4 位数块。

于 2013-06-05T04:39:09.530 回答
3

fmod()from 函数族提供where 的浮点余数,并且<cmath>是函数的两个参数。x / yxy

于 2013-06-05T04:39:11.983 回答
3

您可以将fmod用于浮点模块化算术。但更简单的解决方案是使用 stringstream 将浮点数转换为字符串,然后将字符串拆分为最多 4 个长度的片段。

于 2013-06-05T04:41:25.867 回答
0

当您将浮点值的二进制表示形式转换为十进制表示形式时(通常通过转换为文本以显示它),您通常会得到一系列无限制的十进制数字。当您设置输出流的精度时,您会告诉运行时库限制它显示的位数并舍入尾部。您在这里要求的内容本质上是相同的,但数字的排列方式与输出流所呈现的不同。最简单的方法是使用输出流生成所需的任意数量的数字,然后根据需要重新排列它们:

std::string result;
std::ostring_stream out;
out << std::fixed << std::precision(12) << result;
// now fiddle with result however you'd like
于 2013-06-05T18:48:31.093 回答