在我的应用中,我有一个金额字段。在金额字段中,用户可以在小数点后输入任意数量的位数。但是当我保存它时,它想要舍入到2位数。此方案适用于我的代码。使用我的代码,如果用户输入值2.445,则保存为2.45。同样
2.115 - > 2.12,
2.125 - > 2.13,
2.135-> 2.14,
2.145 - > 2.15,
2.155 - > 2.16,
2.165 - > 2.17,
2.175 - > 2.18 BUT 如果用户输入是2.185,在这种情况下我需要保存为2.19但它仅保存为2.48。而且如果输入是2.195,它应该保存为2.20但它只保存为2.19 ..如何解决这个问题?我附上了我的代码。
float Rate_int = [AmountValue floatValue];
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setRoundingMode: NSNumberFormatterRoundHalfUp];
[formatter setMaximumFractionDigits:2];
NSString *numberString = [formatter stringFromNumber:[NSNumber numberWithFloat:Rate_int]];
简而言之,如果第三位数大于或等于5,我想在所有情况下进行四舍五入..但2.185不会四舍五入到2.9 ..同样2.195不会四舍五入到2.20。我只在这两种情况下遇到问题..
答案 0 :(得分:3)
使用%。2f
NSString *strNum = [NSString stringWithFormat:@"%.2f",2.185];
NSLog(@"%@",strNum);
或最多小数位
float roundToTwo (float num)
{
return round(100 * num) / 100;
}
答案 1 :(得分:2)
2.185
不能完全表示为二进制浮点数。
对于精确的十进制算术,您应该避免float
或double
,并使用
NSDecimalNumber
代替:
NSString *AmountValue = @"2.185";
NSDecimalNumber *decnum = [NSDecimalNumber decimalNumberWithString:AmountValue];
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setRoundingMode: NSNumberFormatterRoundHalfUp];
[formatter setMaximumFractionDigits:2];
NSString *numberString = [formatter stringFromNumber:decnum];
// gives "2.19"
答案 2 :(得分:0)
这是一个浮点精度问题。您可以使用double而不是float来避免此问题。
double Rete_int = [AmountValue doubleValue];
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setRoundingMode: NSNumberFormatterRoundHalfUp];
[formatter setMaximumFractionDigits:2];
[formatter setMinimumFractionDigits:2];
NSString *numberString = [formatter stringFromNumber:[NSNumber numberWithDouble:Rete_int]];