繁体   English   中英

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

[英]Convert float to float and truncate after two decimal places Objective-C

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

你们能帮我这个忙吗?

%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

很难检查,但可能浮动不能完全代表4.73。 最接近的可表示值为4.7300000191。 我是这么说的:四舍五入的十进制表示形式并不总是可能的“二进制浮点数”表示形式。 您将面对许多价值的问题。

尝试这个 :

    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);

如果要截断所有其他小数,可以声明一个简单的方法,如下所示:

- (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

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

您可以使用:

-[NSDecimalNumber decimalNumberWithString:]

来创建您的号码,还有许多使用NSDecimalNumbers方法-有关详细信息,请参阅Apple的文档NSDecimalNumber.h

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM