Domanda

Ho un array che memorizza Input TextField.Text. Quindi recupero il testo altrove come un galleggiante. Questo sembra darmi il "numero esatto" dal campo di testo.

Esempio A.

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

NSMutableArray *storedData = 
 appDelegate.myData;

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

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

Se mytextfield.text input is 22.8, float number ritorna 22.8

però,

Esempio b

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

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

float number ritorna 22.7999999

Non capisco perché ottengo il numero esatto nell'esempio a

È stato utile?

Soluzione

Il valore 22.8 non può essere rappresentato esattamente nel punto mobile binario. Quello che stai vedendo è una rappresentazione basata sul formato di visualizzazione. Diversi metodi di visualizzazione possono utilizzare diversi formati di visualizzazione. La visualizzazione di un numero diverso di cifre e l'arrotondamento significa che sia 22,8 che 22.7999999 sono corretti per il numero di cifre visualizzate dopo l'arrotondamento. Si noti che è stato visualizzato 22.7999999 e non 22.8000000 perché la cifra successiva era 2, quindi il valore visualizzato è stato arrotondato.

Questo dipende dalla base, che sono cose che possono essere esatte in una base numerica potrebbe non essere in grado di essere esatti in una base numerica diversa. In questo caso 22,8 nella base del numero decimale non può essere esatto nella base di numeri binari.

Questo è il motivo per cui esiste NSDecimal e il motivo per cui il punto galleggiante non viene utilizzato per i valori monetari.

Ciò è in qualche modo equivalente alla visualizzazione del valore di PI in Base Decimal, il numero di cifre è infinito, quindi per ogni display qualcuno ha deciso quante cifre da mostrare. È interessante notare che PI può essere rappresentato esattamente (ma utilmente) nella base numerica PI. :-)

In caso di float e double C'è un numero finito di cifre che possono essere rappresentate.

Altri suggerimenti

Prova così:-

[storedData replaceObjectAtIndex: myIndex    
 withObject: [NSNumber 
 numberWithFloat:22.8]];
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top