【问题标题】:Splitting a double into multiple parts将 double 拆分为多个部分
【发布时间】:2013-06-05 04:35:08
【问题描述】:

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

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

还有其他办法吗?

【问题讨论】:

    标签: c++ split double


    【解决方案1】:

    来自<cmath>fmod() 系列函数提供了x / y 的浮点余数,其中xy 是函数的两个参数。

    【讨论】:

      【解决方案2】:

      您始终可以将小数部分“提升”为整数,方法是先乘以 10000,然后再乘以 10000。这将取前四位小数,然后将它们变成整数。重复此操作以获得更多的 4 位数块。

      【讨论】:

      • 我知道,但我想知道如何修改浮点值。但正如@JonathanLeffler 所说,我需要的函数在 cmath 中。
      【解决方案3】:

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

      【讨论】:

      • 为什么?我认为流操作非常昂贵,然后是stringstreamstring,还有stringint。这似乎真的很昂贵。
      • 嗯,实际成本取决于应用程序。当然,对于整数来说可能很昂贵,但对于浮点数,我不太确定。您对应用程序性能敏感吗?如果它是一个正常的应用程序,并且这个函数不会被调用数千或数百万次,那么为什么不使用直接的解决方案
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-05-30
        • 1970-01-01
        • 1970-01-01
        • 2020-05-04
        • 2012-11-10
        • 2010-12-05
        • 1970-01-01
        • 1970-01-01
        • 2018-03-10
        相关资源
        最近更新 更多