从浮点数中提取个别数字

mes*_*ger 2 c++ floating-point extract digits

我一整天都在敲打这个.我目前正在处理的C++项目需要显示可编辑的值.当前选择的数字显示上面的递增值和下面的所述数字的递减值.能够将可编辑值引用为数字和数字集合是有用的.如果有一些浮点数的可索引形式,那将是多么令人敬畏,但我一直无法找到这样的解决方案.我正在抛出这个问题,看看是否有一些显而易见的东西我缺失了,或者我是否应该自己动手.


感谢您的建议!我希望找到一个不会从float - > string - > int转换的解决方案,但我认为这是摆脱浮点量化问题的最佳方法.我最终使用boost :: format并仅引用字符串的各个字符.与使用modf和fmod的组合来尝试从浮点数中获取数字相比,我看不出这是一个巨大的性能差异(它可能只是在幕后,只比我的实现更强大).

Lok*_*oki 5

浮点数的内部表示与您看到的不同.你只能投奔到一个劲地.

要施放,请执行以下操作:

char string[99];
sprintf(string,"%f",floatValue);
Run Code Online (Sandbox Code Playgroud)

或者看看:http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.1

维基百科文章可以解释更多关于表示的内容:http://en.wikipedia.org/wiki/Floating_point


Mr.*_*Ree 5

哦,有很多方法可以转换为字符串。 (虽然我自己更喜欢 s n printf() 。)

或者您可以转换为 int 并使用模数和整数除法将数字拉出。您可以使用 log{base10} 计算位数。

(记住:log{baseA}_X / log{baseA}_B = log{baseB}_X。)

例子:

#define SHOW(X) cout << # X " = " << (X) << endl

int
main()
{
  double d = 1234.567;

  SHOW( (int(d)%10000) / 1000 );
  SHOW( (int(d)%1000)  / 100  );
  SHOW( (int(d)%100)   / 10   );
  SHOW( (int(d)%10)           );
  SHOW( (int(d*10)  % 10)     );
  SHOW( (int(d*100) % 10)     );
  SHOW( (int(d*1000)% 10)     );

  SHOW( log(d)/log(10) );
}
Run Code Online (Sandbox Code Playgroud)

虽然你应该使用 static_cast ...

注意指数符号。对于非常大或非常小的数字,您可能会遇到问题。

浮点数也有四舍五入的问题,可能会给您带来一些麻烦。(这与我们不在两个双精度值之间使用 operator== 的原因相同。或者为什么您不能依赖 a*b == b*a。根据 a & b 的确切值,它们可能会略有不同大约 10^-25。)