【发布时间】:2011-07-25 00:10:36
【问题描述】:
我无法实现浮点数的四舍五入。
对于 theoTimeoutTrick 和 theoTimeout,这些调用都返回 3.5999999 而不是 3.6。
我如何才能将 3.6 的值放入 NSString AND float vars 中?
#define minTimeout 1.0
#define defaultNbRetry 5
float secondsWaitedForAnswer = 20.0;
float minDelayBetween2Retry = 0.5;
int theoNbRetries = defaultNbRetry;
float theoTimeout = 0.0;
while (theoTimeout < minTimeout && theoNbRetries > 0) {
theoTimeout = (secondsWaitedForAnswer - (theoNbRetries-1)*minDelayBetween2Retry) / theoNbRetries;
theoNbRetries--;
}
float theoTimeoutTrick = [[NSString stringWithFormat:@"%.1f", theoTimeout] floatValue];
theoTimeout = roundf(theoTimeout * 10)/10.0;
【问题讨论】:
-
3.6 不能用有限多位二进制精确表示。
-
我确定我的银行账户没有使用 IEEE 浮点数作为我的余额! (主要是因为它们的范围有限:-))。使用格式化输出打印适当的舍入值。
-
您在实际输出到字符串时进行格式化。我所能看到的只是分配浮点数和整数。你的输出打印在哪里?
-
或者,使用 NSDecimal 和 NSDecimalNumber。
-
@Kerrek 货币处理软件通常使用二进制编码的十进制 (BED),每个数字使用 4 位。但是,如果您尝试类似
NSLog(@"%f", 3.6);的方法,您会发现它确实打印了3.60000
标签: objective-c cocoa floating-point rounding