Pergunta

Eu tenho sido batendo minha cabeça em um presente durante todo o dia. O projeto C ++ Atualmente, estou trabalhando tem um requisito para exibir um valor editável. Os dígitos exibe actualmente seleccionados do valor incrementado acima e abaixo do valor reduzido para o dito dígito. É útil para ser capaz de referenciar o valor editável como um número e recolha de dígitos. O que seria impressionante é se havia alguma forma indexável de um número de ponto flutuante, mas eu tenho sido incapaz de encontrar solução tal. Estou jogando esta pergunta lá fora para ver se há algo óbvio que estou em falta ou se eu deveria apenas fazer a minha própria.


Obrigado pelo conselho! Eu estava esperando por uma solução que não iria converter de float -> string -> int, mas eu pensar que é a melhor maneira de ficar longe de problemas ponto de quantização flutuante. Eu acabei indo com boost :: formato e apenas referenciando os caracteres individuais da string. Eu não posso ver o que foi uma enorme diferença de desempenho comparado ao uso de combinações de modf e fmod para tentar obter um dígito fora de um float (Provavelmente faz exatamente isso nos bastidores, só que mais robusta do que a minha aplicação).

Foi útil?

Solução

representação interna dos números de ponto flutuante não são como você foi ver. Você só pode lançar a um stirng.

Para elenco, faça o seguinte:

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

Ou ver o seguinte: http: // www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.1

O artigo wikipedia pode explicar mais sobre a representação: http://en.wikipedia.org/wiki/ Floating_point

Outras dicas

Oh, existem muitas maneiras de converter para uma string. ( embora eu prefiro s n printf () eu mesmo.)

Ou você pode converter para um int e puxe os dígitos com módulo e inteiro de divisão. Você pode contar o número de dígitos com log {Base10}.

(Lembre-se:. Log {baseA} _X / log {baseA} _B = log {baseB} _X)

Exemplo:

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

Embora você deve usar static_cast ...

Watch para fora para notação exponencial. Com muito grandes ou muito pequenos números, você pode ter um problema.

Números de ponto flutuante também tem problemas fora redondas que podem causar-lhe algum sofrimento. (É a mesma razão pela qual nós não usar o operador == entre dois duplos. Ou por que você não pode contar com a * b == b * a. Dependendo dos valores exatos de a & b, eles podem diferir muito ligeiramente a cerca de 10 ^ -25).

Você pode lançar entre corda e bóia somente usando boost :: lexical_cast. No entanto, você pode não diretamente índice a forma float - ele é internamente não armazenada como dígitos decimais. Isto provavelmente não é que muito de um problema. Para sua UI, você provavelmente irá manter uma forma de string do número de qualquer maneira, com conversões de e para flutuar no getter / setter.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top