C++ 从浮点数中提取单个数字

C++ 从浮点数中提取单个数字,c++,floating-point,extract,digits,C++,Floating Point,Extract,Digits,这件事我一整天都在忙。我目前正在处理的C++项目有一个要求显示可编辑的值。当前选定的数字显示上述数字的递增值和递减值。能够将可编辑值作为数字和数字集合引用是很有用的。如果有一个浮点数的可转位形式,那就太棒了,但我一直找不到这样的解决方案。我把这个问题抛出去,看看是否有明显的东西我遗漏了,或者我是否应该自己动手 谢谢你的建议!我希望找到一种不会从float->string->int转换的解决方案,但我认为这是摆脱浮点量化问题的最好方法。最后我使用了boost::format,只引用了字符串的各个

这件事我一整天都在忙。我目前正在处理的C++项目有一个要求显示可编辑的值。当前选定的数字显示上述数字的递增值和递减值。能够将可编辑值作为数字和数字集合引用是很有用的。如果有一个浮点数的可转位形式,那就太棒了,但我一直找不到这样的解决方案。我把这个问题抛出去,看看是否有明显的东西我遗漏了,或者我是否应该自己动手



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

浮点数的内部表示与您看到的不同。你只能投一个球

要转换,请执行以下操作:

char string[99];
sprintf(string,"%f",floatValue);
或者看看这个:

维基百科的文章可以解释更多关于表示的内容:

(尽管我自己更喜欢snprintf()

或者你可以转换成一个整数,然后用模和整数除法把数字取出来。可以使用日志{base10}计算位数

(记住:log{baseA}\ux/log{baseA}\ub=log{baseB}\ux。)

例如:

#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) );
}

#define SHOW(X)cout您只能使用boost::lexical_cast在字符串和浮点之间进行强制转换。但是,您不能直接为浮点形式编制索引-它在内部不存储为十进制数字。这可能不是什么大问题。对于您的UI,您很可能会保留一个数字的字符串形式,并在getter/setter中进行与float的转换。

我不会确切地称之为强制转换,但这是一个很好的答案。强制转换形式是boost::lexical_cast(floatValue);