26
NSDate *date = [NSDate date];
XCTAssertEqual([[store selectedDate] timeIntervalSinceReferenceDate], [date timeIntervalSinceReferenceDate]);

これにより、次のエラーメッセージが表示されます。

(([[store selectedDate] timeIntervalSinceReferenceDate]) equal to ([date timeIntervalSinceReferenceDate])) failed: 
("405290648.294") is not equal to ("405290648.294")

私は以前に整数で同様の問題を抱えていましたが、ここでNSUInteger説明されているようにキャストすることで解決する必要がありました。

しかし、NSDateオブジェクト/ダブルでこれを解決する方法がわかりませんでした(この場合のように)。

4

5 に答える 5

35

XCTAssertEqualWithAccuracy浮動小数点数の比較に使用

XCTAssertEqualWithAccuracy([[store selectedDate] timeIntervalSinceReferenceDate], [date timeIntervalSinceReferenceDate], 0.001);
于 2013-11-04T21:08:32.000 に答える
0

簡単なテストを実行すると、値が異なることがわかります。アサーション出力でそれらが同じように見えるという事実は、ログ出力が構築される方法に関係している可能性が最も高いです。

NSDate *date  = [NSDate date];
NSDate *date2 = [NSDate date];

NSLog(@"%f %f", [date2 timeIntervalSinceReferenceDate], [date timeIntervalSinceReferenceDate]); //=> 405292099.192900 405292099.192899

XCTAssertEqual([date2 timeIntervalSinceReferenceDate], [date timeIntervalSinceReferenceDate]);

XCTAssertEqualWithAccuracyこれらは本質的にdouble値であるため、使用する必要があります

于 2013-11-04T21:11:39.090 に答える
0

問題は、2 つのdouble値がおそらく、アサーションに表示されるよりも 1 桁多く異なることです (おそらく405290648.2942vs. 405290648.2941)。

比較で小数秒を気にしない場合は、両方の値で or を使用するroundfloor、両方をキャストしlong longます。

于 2013-11-04T21:08:12.530 に答える