2014-11-10 4 views
0

그래서 프로그래밍에서 수행하려고하는 기본적인 수학 방정식이 있습니다.수학은 NSInteger에서 바로 나오지 않습니다. 목표 C

NSInteger testValue = (self.waveform.zoomStartSamples/self.waveform.totalSamples)*100; 

Self.waveform.zoomStartSamples 부호없는 긴 INT zoomStartSamples (비 원자, 할당) @property이고;

self.waveform.totalSamples는 @property (비 원자, 할당, 읽기 전용)입니다. unsigned long int totalSamples; testValue의

값이 0 zoomStartSamples입니다 1,033,554 totalSamples은 4,447,232

I 돈이다 : 여기

내가 얻을, 결과 NSLog의 내가 여기

NSLog(@"Value of testValue is %ld", (long)testValue); 
    NSLog(@"zoomStartSamples are %lu", self.waveform.zoomStartSamples); 
    NSLog(@"totalSamples are %lu", self.waveform.totalSamples); 

를 실행하고있어입니다입니다 testValue의 가치는 0이되어야한다고 생각하지 않습니다. 어떤 아이디어입니까?

궁극적으로 저는 다른 곳에서 다른 값을 사용하기 위해 그 값을 플로팅하고 싶습니다. 감사.

+0

당신은 틀렸다고 생각합니다. 당신은 정수 산술을하고 있습니다. 1033554를 4447232로 나눈 값은 0입니다. –

답변

1

zoomStartSamples/totalSamples의 결과는 int 0이므로 0 * 100 = 0이므로 zoomStartSamples * 100/totalSamples을 대신 사용해보십시오.

2

이것은 정수 수학의 성격입니다. 1033554/4447232 = 0.23240388628252. 그러나이 값은 정수로 표시 할 수 없습니다. 0에서 1 사이입니다. C에서 결과는 0으로 절단됩니다. 그런 다음 100을 곱해도 여전히 0이 산출됩니다.

소수 값을 원하면 부동 소수점 연산을 사용해야합니다. 결과를 정수로 다시 변환 할 수 있습니다. 대부분의 경우 컴파일러는 최종 변환을 자동으로 수행합니다. 예를 들어

NSInteger testValue = (self.waveform.zoomStartSamples/(double)self.waveform.totalSamples)*100; 

double 한 표현식을 전송하여, 분단 double들로 수행된다. 분자는 자동으로 double으로 승격됩니다. 결과는 double입니다. 유사하게, 승산은 doubles; 100double으로 승격됩니다. double 결과가 정수 변수에 지정되면 잘립니다.