我有一个浮点数var1 = cashInHandAmount = 4.73000002 我只想要: var2 = 4.73。
我试过这样的话:
NSString *floatString = [NSString stringWithFormat:@"%.02f",cashInHandAmount];//it prints 4.73
[self.editcash setMaxValue:[floatString floatValue]];//but it again sets 4.73000002 why?
你能帮我解决这个问题吗?
答案 0 :(得分:3)
%f只是对输出进行舍入。如果精确值(即4.73)在浮点格式中没有表示,则将浮点值转换为字符串并返回不起作用。因此,将其转换回来将会#34; round"将存储值4.73转换为浮点格式,显然是4.730 ... 02。
您应该很少使用(二进制,IEEE)浮动进行财务计算。金融价值(金额)在大多数情况下是美分的整数值,但没有美元(或其他)的浮动值。此外,您可以考虑使用NSDecimal
和NSDecimalNumber
来确保每个具有两位精度的值都可以存储在格式中。
编辑:
float f = 4.73000002;
float rounded = roundf(f * 100.0f) / 100.0f;
NSLog(@"%10.10f", rounded);
输出:
2014-07-01 10:25:48.653 xctest [596:303] 4.7300000191
很难检查,但可能浮动不能完全代表4.73。最接近的可表示值是4.7300000191。这就是我所说的:圆形十进制表示并不总是可能的"二进制浮点数"表示。你将面临许多价值观的问题。
答案 1 :(得分:2)
试试这个:
float var1 = 4.73000002;
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.numberStyle = NSNumberFormatterDecimalStyle;
formatter.maximumFractionDigits = 2; //Set number of fractional digits
NSNumber *num = [NSNumber numberWithFloat:var1];
NSString *roundedNum = [formatter stringFromNumber:num];
DLOG(@"Answer : %@", roundedNum);
答案 2 :(得分:1)
如果要截断所有其他小数,可以声明一个这样的简单方法:
- (float)sanitizeFloat:(float)value
{
float newValue = [[NSString stringWithFormat:@"%.2f",value] floatValue];
return newValue;
}
然后
float aFloat = 45.070809;
NSLog(@"%f",[self sanitizeFloat:aFloat]);
在你的情况下:
[self.editcash setMaxValue:[self sanitizeFloat:cashInHandAmount]];
输出将为45.070000
答案 3 :(得分:0)
如果您正在处理具有固定小数位的货币金额,则应始终使用NSDecimal
或NSDecimalNumber
- 您根本不应使用浮点数,因为它们不准确
您可以使用:
-[NSDecimalNumber decimalNumberWithString:]
创建您的号码,有许多方法可以使用NSDecimalNumbers
- 有关详细信息,请参阅Apple's docs或NSDecimalNumber.h
。