1
**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 转换为在点后保留两位数,请您告知如何转换?

4

1 回答 1

4

因为 1.345 在 IEEE754 中无法准确表示。很可能,它类似于 1.34444444449,当打印出来时,它会给你 1.34。

如果您搜索 ieee754、精度和浮点之类的东西,十亿左右的文章中的一篇应该能够启发您:-)

特别注意:每个计算机科学家都应该知道的关于浮点的知识

更详细一点,检查以下 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.345。

这就解释了为什么你看到它被截断为1.34而不是四舍五入1.35

于 2012-08-25T12:49:02.197 回答