回答:
数値の保存方法の問題ではなく、表示方法の問題です。これを文字列に変換するときは、希望する精度(小数点以下2桁)に丸める必要があります。
例えば:
NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat];
%.02f
float(%f
)をフォーマットすることを2桁に丸め、0
sを埋め込む必要があることをフォーマッターに伝えます。
例えば:
%f = 25.000000
%.f = 25
%.02f = 25.00
25
.. @"%.f"
トリックを行います。上記に書かれていることはありません。
@"%.*f", decimalPlaces, number
%03.f = 025
ここにいくつかの修正があります
//for 3145.559706
スウィフト3
let num: CGFloat = 3145.559706
print(String(format: "%f", num)) = 3145.559706
print(String(format: "%.f", num)) = 3145
print(String(format: "%.1f", num)) = 3145.6
print(String(format: "%.2f", num)) = 3145.56
print(String(format: "%.02f", num)) = 3145.56 // which is equal to @"%.2f"
print(String(format: "%.3f", num)) = 3145.560
print(String(format: "%.03f", num)) = 3145.560 // which is equal to @"%.3f"
Obj-C
@"%f" = 3145.559706
@"%.f" = 3146
@"%.1f" = 3145.6
@"%.2f" = 3145.56
@"%.02f" = 3145.56 // which is equal to @"%.2f"
@"%.3f" = 3145.560
@"%.03f" = 3145.560 // which is equal to @"%.3f"
等々...
NSNumberFormatterを使用して試すこともできます。
NSNumberFormatter* nf = [[[NSNumberFormatter alloc] init] autorelease];
nf.positiveFormat = @"0.##";
NSString* s = [nf stringFromNumber: [NSNumber numberWithFloat: myFloat]];
ネガティブフォーマットも設定する必要があるかもしれませんが、それを理解するのに十分賢いと思います。
上記の回答に基づいて迅速な拡張を行いました
extension Float {
func round(decimalPlace:Int)->Float{
let format = NSString(format: "%%.%if", decimalPlace)
let string = NSString(format: format, self)
return Float(atof(string.UTF8String))
}
}
使用法:
let floatOne:Float = 3.1415926
let floatTwo:Float = 3.1425934
print(floatOne.round(2) == floatTwo.round(2))
// should be true
精度に応じて動的にフォーマットする方法は次のとおりです。
+ (NSNumber *)numberFromString:(NSString *)string
{
if (string.length) {
NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
f.numberStyle = NSNumberFormatterDecimalStyle;
return [f numberFromString:string];
} else {
return nil;
}
}
+ (NSString *)stringByFormattingString:(NSString *)string toPrecision:(NSInteger)precision
{
NSNumber *numberValue = [self numberFromString:string];
if (numberValue) {
NSString *formatString = [NSString stringWithFormat:@"%%.%ldf", (long)precision];
return [NSString stringWithFormat:formatString, numberValue.floatValue];
} else {
/* return original string */
return string;
}
}
例えば
[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:4];
=> 2.3453
[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:0];
=> 2
[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:2];
=> 2.35(切り上げ)