Pergunta

Eu tenho uma matriz que armazena a entrada textfield.text. Eu então recupero o texto em outro lugar como flutuação. Isso parece me dar o "número exato" do campo de texto.

Exemplo a

   navtestAppDelegate *appDelegate = 
   (navtestAppDelegate *)[[UIApplication 
    sharedApplication] delegate];

NSMutableArray *storedData = 
 appDelegate.myData;

[storedData replaceObjectAtIndex: myIndex withObject: mytextfield.text];

float number = [[storedData objectAtIndex:myIndex] floatValue];

E se mytextfield.text input is 22.8, float number retorna 22.8

Contudo,

Exemplo b

[storedData replaceObjectAtIndex: myIndex withObject: @"22.8”];

float number  = [[storedData objectAtIndex:myIndex] floatValue];

float number retorna 22.7999999

Não entendo por que recebo o número exato no exemplo a

Foi útil?

Solução

O valor 22.8 não pode ser representado exatamente no ponto flutuante binário. O que você está vendo é uma representação com base no formato de exibição. Diferentes métodos de exibição podem usar diferentes formatos de exibição. Exibir um número diferente de dígitos e o arredondamento significa que 22.8 e 22.7999999 estão corretos para o número de dígitos exibidos após o arredondamento. Observe que 22.7999999 foi exibido e não 22.8000000 porque o próximo dígito foi 2, portanto o valor exibido foi arredondado.

Isso depende da base, que são coisas que podem ser exatas em uma base de números podem não ser capaz de ser exata em uma base de números diferente. Nesse caso, 22.8 na base de números decimais não podem ser exatos na base de números binários.

Esta é a razão pela qual existe nsdecimal e a razão pela qual o ponto flutuante não é usado para valores monetários.

Isso é um pouco equivalente a exibir o valor do PI no decimal básico, o número de dígitos é infinito; portanto, para cada exibição alguém decidiu quantos dígitos mostram. Curiosamente, o PI pode ser representado exatamente (mas útil) na base de números PI. :-)

No caso de float e double Há um número finito de dígitos que podem ser representados.

Outras dicas

Tente assim:-

[storedData replaceObjectAtIndex: myIndex    
 withObject: [NSNumber 
 numberWithFloat:22.8]];
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top