所以我有一个基本的数学方程式,我试图在编程中执行。
NSInteger testValue = (self.waveform.zoomStartSamples/self.waveform.totalSamples)*100;
Self.waveform.zoomStartSamples是@property(非原子,赋值)unsigned long int zoomStartSamples;
self.waveform.totalSamples是@property(nonatomic,assign,readonly)unsigned long int totalSamples;
以下是我正在运行的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 zoomStartSamples是1033554 totalSamples是4447232
我不认为testValue的值应该是0。任何想法?
最终我想将值浮动到另一个变量以在其他地方使用它。感谢。
答案 0 :(得分:2)
这是整数数学的本质。 1033554/4447232 = 0.23240388628252。但是,该值不能表示为整数。它在0和1之间。在C中,结果被截断为0.然后,将它乘以100,仍然得到0.
如果需要小数值,则需要使用浮点数学。您可以在最后将结果转换回整数。在许多情况下,编译器将自动执行最终转换。例如:
NSInteger testValue = (self.waveform.zoomStartSamples/(double)self.waveform.totalSamples)*100;
通过将一个子表达式转换为double
,将使用double
s执行除法。分子自动提升为double
。结果是double
。同样,乘法用double
s进行; 100
被提升为double
。当double
结果分配给整数变量时,它将被截断。
答案 1 :(得分:1)
这是因为zoomStartSamples/totalSamples
导致int 0,所以0 * 100 = 0,尝试使用
而是zoomStartSamples * 100/totalSamples
。