2012-09-06 5 views
7
NSNumberFormatter *format = [[NSNumberFormatter alloc]init]; 
[format setNumberStyle:NSNumberFormatterDecimalStyle]; 
[format setRoundingMode:NSNumberFormatterRoundHalfUp]; 
[format setMaximumFractionDigits:2]; 
NSString *temp = [format stringFromNumber:[NSNumber numberWithFloat:23.4451]]; 
NSLog(@"%@",temp); 

Ich brauche eine sechs Dezimalbruchzahl auf zwei Dezimalstellen. In iOS habe ich den obigen Code ausprobiert. Ich bekomme die Antwort 23.5, wenn ich Eingabe als 23.45 gebe, aber wenn ich Eingabe 23.445 gebe, lautet die Antwort 23.44.Dezimalbruch in IOS

Könnte jemand in iOS "halb aufräumen".

+0

Aber ich bekomme richtige Antwort für den Eingang 23,45 als 23.45. – Aravindhan

+1

Ich vermute, dass dies mit der Art und Weise zu tun hat, wie Floats im Computer dargestellt werden. Sie können 23.445 eingeben, aber intern könnte es als 23.4449999 dargestellt werden, so dass es abgerundet wird. – rdelmar

Antwort

17

Interessanterweise, zumindest für mich, ist es ein Float-Präzisions-Problem. Wie rdelmar in Kommentaren vorgeschlagen hatte.

Dieses Problem kann zumindest bei diesem Genauigkeitsniveau vermieden werden, indem ein Doppel verwendet wird. Zum Beispiel:

NSNumberFormatter *format = [[NSNumberFormatter alloc]init]; 
[format setNumberStyle:NSNumberFormatterDecimalStyle]; 
[format setRoundingMode:NSNumberFormatterRoundHalfUp]; 
[format setMaximumFractionDigits:2]; 
[format setMinimumFractionDigits:2]; 

// With Float: 
NSLog(@"%@",[format stringFromNumber:[NSNumber numberWithFloat:23.445]]); // Float 
// Logs 23.44 
NSLog(@"%@",[format stringFromNumber:[NSNumber numberWithDouble:23.445]]); // Double 
// Logs 23.45 

Sie hatten also keinen schlechten Code, nur ungenaue Variablen.

+0

thaks funktioniert .. – karan