从浮点数中提取个别数字

时间:2008-12-03 23:35:55

标签: c++ floating-point extract digits

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


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

3 个答案:

答案 0 :(得分:5)

浮点数的内部表示与你看到的不一样。你只能投入搅拌。

要施放,请执行此操作:

char string[99];
sprintf(string,"%f",floatValue);

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

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

答案 1 :(得分:3)

Oh, there are many ways to convert to a string.(虽然我自己更喜欢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) );
}

虽然你应该使用static_cast ......

注意指数表示法。如果数字非常大或非常小,您可能会遇到问题。

浮点数也会出现问题,可能会让您感到悲伤。 (这也是为什么我们不在两个双打之间使用operator ==的原因。或者为什么你不能依赖a * b == b * a。根据a&amp; b的确切值,它们可能会有很大不同稍微大约10 ^ -25。)

答案 2 :(得分:0)

只能使用boost :: lexical_cast在string和float之间进行转换。但是,您不能直接索引float表单 - 它在内部不会存储为十进制数字。这可能不是一个问题。对于你的用户界面,你最有可能保留数字的字符串形式,在getter / setter中与float进行转换。