数学没有出现在NSInteger Objective C中

时间:2014-11-10 02:04:59

标签: objective-c xcode nsinteger

所以我有一个基本的数学方程式,我试图在编程中执行。

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。任何想法?

最终我想将值浮动到另一个变量以在其他地方使用它。感谢。

2 个答案:

答案 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