2009-09-02 2 views
4

저는 CGFloat를 가지고 있지만 NSInteger로 필요합니다. float 값은 2.0f와 같기 때문에 분수 부분과 정밀도가 떨어지는 것에 대해서는 신경 쓰지 않습니다. 문제없이 NSInteger로 변환 할 수있는 합법적 인 방법은 무엇입니까 (물론 정밀도의 손실 제외)?안전하게 CGFloat에서 NSInteger를 만드는 방법은 무엇입니까?

NSInteger niceInt = niceCGFloat; 

은 너무 단순 해 보이며 버그가 있습니다. 어쩌면 설명 할 수 있을까요?

답변

6

바이너리로 표현할 때 2.0f가 실제로 1.9999999999f가 될 위험이 있습니다. int로 변환하면 2 대신 1이됩니다.

이 문제를 방지하려면 0.5f를 부동 소수점 값에 더합니다. 이것은 또한 자르지 않고 플로트를 반올림하는 효과가 있습니다.

NSInteger niceInt = niceCGFloat + 0.5f;

7

당신은 long int와 부동 소수점을 반올림 C 함수 lrintf()를 원한다.

관련 문제