Iphone 目标C:四舍五入浮动问题
我不同意把计算结果四舍五入到小数点后两位 这是一个财务计算,当结果涉及半便士时,我预计数字会向上舍入,但实际上是向下舍入 要复制此问题,请执行以下操作:Iphone 目标C:四舍五入浮动问题,iphone,objective-c,floating-point,double,decimal,Iphone,Objective C,Floating Point,Double,Decimal,我不同意把计算结果四舍五入到小数点后两位 这是一个财务计算,当结果涉及半便士时,我预计数字会向上舍入,但实际上是向下舍入 要复制此问题,请执行以下操作: float raw = 16.695; NSLog(@"All DP: %f",raw); NSLog(@"2 DP: %.2f",raw); 返回: All DP: 16.695000 2 DP: 16.69 鉴于我希望看到: All DP: 16.695000 2 DP: 16.70 有没有人能告诉我这是故意的,或者(很可能)我遗漏了
float raw = 16.695;
NSLog(@"All DP: %f",raw);
NSLog(@"2 DP: %.2f",raw);
返回:
All DP: 16.695000
2 DP: 16.69
鉴于我希望看到:
All DP: 16.695000
2 DP: 16.70
有没有人能告诉我这是故意的,或者(很可能)我遗漏了什么,或者我能做些什么来绕开它。在这种情况下,这一点至关重要
提前感谢,,
据我所知,
NSLog()
函数只接受格式化参数,不尝试取整
您可能习惯使用支持舍入的printf()
样式函数
我建议使用
math.h
中的许多函数之一在输出前对值进行四舍五入,并且仅依赖NSLog()
进行格式设置 看到评论后
使用C标准函数族round()。roundf()用于浮动,round()用于双精度,和roundl()用于长双精度。然后可以将结果强制转换为所选的整数类型
有些值是浮动的<代码>16.695就是其中之一。当您尝试将该值存储在浮点中时,实际上会得到最接近的可表示值。当你对一个浮点数执行一系列的操作时,你会失去精度。这会导致亏损
使用实际货币类型,使用或使用int
s进行所有计算,计算出您关心的最小单位(即,1050
整美分为10.50美元,如果您想要分币的分数,则为1.050美元)。您可以尝试以下方法:
- (void)testNSlogMethod {
float value = 16.695; //--16.70
value = value *100;
int mulitpler = round(value);
NSLog(@"%.2f",mulitpler/100.0f);
}
尝试NSLog(@“9 DP:%.9f”,原始);你会得到:16.694999695,如果你使用双精度,它会在你的例子中四舍五入,好吧,这是可行的,但出于兴趣,为什么?为什么它不将数字存储为设置的16.695?谢谢,但NSLog仅用于此示例-在实际应用程序中,我使用[NSString stringWithFormat:@“%.2f,xxx]。我相信这与printf()的取整方式相同是的。你建议的功能是什么?我相信这种风格的帖子被称为,我听说他们正在考虑将其添加到格式标签中:
。