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? 

ポイントの後に 2 桁を保持するように NSString を変換したい場合、変換方法を教えてください。

4

1 に答える 1

4

1.345 は IEEE754 では正確に表現できないためです。おそらく、これは 1.34444444449 のようなもので、印刷すると 1.34 になります。

ieee754、精度、浮動小数点などを検索すると、10 億程度の記事の 1 つがあなたを啓発できるはずです :-)

特に注意してください:すべてのコンピューター科学者が浮動小数点について知っておくべきこと

もう少し詳しく説明すると、次の 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.345f

1.34これは、 に丸められるのではなく、に切り捨てられている理由を説明しています1.35

于 2012-08-25T12:49:02.197 に答える