为何输​​出? NSLog(@“%0.2f”,1.345); //输出1.34

时间:2012-08-25 12:46:09

标签: iphone floating-point nslog output-formatting

**NSLog(@"%0.2f", 1.345); // output 1.34**
NSLog(@"%0.2f", 1.3451);// output 1.35
NSLog(@"%0.2f", round(1.345 * 100)/100.);//output 1.35

为什么第一行输出1.34?!!

=======================================

更新

NSLog(@"%.2f", round([@"644.435" doubleValue] * 100) / 100); // output 644.43, 

NSLog(@"%.2f", round([@"6.435" doubleValue] * 100) / 100); // output 6.44? 

如果我想转换NSString以保持两位数之后,请告知如何转换?

1 个答案:

答案 0 :(得分:4)

因为1.345无法在IEEE754中完全表示。更有可能的是,它类似于1.34444444449,打印时会给你1.34。

如果你搜索像ieee754,精度和浮点这样的东西,那么十亿左右的文章中的一篇应该能够启发你: - )

特别注意:What every computer scientist should know about floating point

进入更多细节,检查以下C程序:

#include <stdio.h>
int main (void) {
    float f = 1.345f;
    double d = 1.345;
    printf ("f = %.20f\nd = %.20lf\n", f, d);
    return 0;
}

这个输出是:

f = 1.34500002861022949219
d = 1.34499999999999997335

因此float值略高于1.345而double(这是指定1.345时没有f后缀的内容)略低于

这解释了为什么您将其截断为1.34而不是舍入为1.35