将float转换为float并在两个小数位后的Objective-C后截断

时间:2014-07-01 08:06:37

标签: iphone objective-c floating cgfloat

我有一个浮点数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?

你能帮我解决这个问题吗?

4 个答案:

答案 0 :(得分:3)

%f只是对输出进行舍入。如果精确值(即4.73)在浮点格式中没有表示,则将浮点值转换为字符串并返回不起作用。因此,将其转换回来将会#34; round"将存储值4.73转换为浮点格式,显然是4.730 ... 02。

您应该很少使用(二进制,IEEE)浮动进行财务计算。金融价值(金额)在大多数情况下是美分的整数值,但没有美元(或其他)的浮动值。此外,您可以考虑使用NSDecimalNSDecimalNumber来确保每个具有两位精度的值都可以存储在格式中。

编辑:

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)

如果您正在处理具有固定小数位的货币金额,则应始终使用NSDecimalNSDecimalNumber - 您根本不应使用浮点数,因为它们不准确

您可以使用:

-[NSDecimalNumber decimalNumberWithString:]

创建您的号码,有许多方法可以使用NSDecimalNumbers - 有关详细信息,请参阅Apple's docsNSDecimalNumber.h