Pergunta

Primeiro post aqui. Tendo um problema com o método FloatValue da NSNumber - de alguma forma, ele retorna um número impreciso. Aqui está o problema: eu guardo um monte de nsnumbers em uma matriz, assim:

NSArray *a = [NSArray arrayWithObjects:
    [NSNumber numberWithFloat:0.04f],
    [NSNumber numberWithFloat:0.028f], 
    [NSNumber numberWithFloat:0.016f],
    [NSNumber numberWithFloat:0.004f],
   nil];

Então eu tento recuperar o primeiro valor (por exemplo): nsnumber n = (NSNumber) [A ObjectATindex: 0]; CGfloat f = [n floatValue];

No depurador, n mostra um valor de 0,04 (na coluna de resumo), mas F mostra um valor de 0,03999999991. O que eu estou fazendo errado aqui?

Obrigado a todos.

Foi útil?

Solução

Você não está fazendo nada de errado. Isso não é um problema especificamente de NSNumber ou CGFloat, qualquer. É algo muito universal sobre os números de pontos flutuantes, que são baseados em poderes de 2, não em potências de dez. Você deve ler Este artigo definitivo ou Artigo da Wikipedia.

O ponto é que os números padrão de ponto flutuante podem representar apenas um número com precisão que é uma soma de 1/2, 1/4, 1/8, .... 1/10 não é. Portanto, você não pode representar com precisão 0.1 usando números de ponto flutuante padrão.

Se você realmente precisa lidar com isso, existem rotinas que lidam com frações racionais ou números de pontos flutuantes decimais.

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