-1

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

4 回答 4

3

%f 只是对输出进行四舍五入。如果确切的值(即 4.73)在浮点格式中没有表示,则将浮点值转换为字符串并返回不起作用。因此,将其转换回来会将存储的值 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

很难检查,但可能 float 不能准确表示 4.73。最接近的可表示值是 4.7300000191。这就是我所说的:四舍五入的十进制表示并不总是可能的“二进制浮点”表示。您将面临许多价值观的问题。

于 2014-07-01T08:21:21.733 回答
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);
于 2014-07-01T09:48:47.620 回答
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

于 2014-07-01T08:47:40.953 回答
0

如果您使用具有固定小数位的货币金额,则应始终使用NSDecimalNSDecimalNumber- 您根本不应该使用浮点数,因为它们是不精确的。

你可以使用:

-[NSDecimalNumber decimalNumberWithString:]

创建您的号码,并且有很多方法可以使用NSDecimalNumbers- 请参阅Apple 的文档NSDecimalNumber.h了解详细信息。

于 2014-07-01T08:59:31.137 回答