把双料分成多个部分

Splitting a double into multiple parts

本文关键字:个部      更新时间:2023-10-16

正如标题所述,我想将一个多位数的双精度数分成多个部分,每个部分包含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;
}

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

还有别的办法吗?

<cmath>fmod()族函数提供了x / y的浮点余数,其中xy是该函数的两个参数

总是可以将小数部分"提升"为整数,方法是乘以10000,然后再乘以10000。这将取小数点后四位,并将其转化为整数。重复执行此操作以获得更多的4位数块。

可以使用fmod进行浮点模运算。但一个更简单的解决方案是使用stringstream将float转换为字符串,并将字符串分成最多4个长度的部分。

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

std::string result;
std::ostring_stream out;
out << std::fixed << std::precision(12) << result;
// now fiddle with result however you'd like