我有两个AVAudioPlayers,分别称为“节点”和“区域”。他们有时会同时玩。发生这种情况时,我需要将“区域”的音量降至0.2。当“节点”完成时,我需要将“区域”返回到其原始卷(从阵列中拉入)。我有一个AdjustPlayerVolume方法和另一个在节点完成时将'nodeIsPlaying'变量设置为false的方法。这些都很好。

以下代码用于检测音量是否需要增大或减小或保持原样。只要应用程序运行,它就会一直循环运行。

            NSLog(@"Zone Volume = %f", zonePlayer.volume);

            if ((nodeIsPlaying == false) && (zonePlayer.volume <= 0.200000)) {
                float maxVolume = [[[locationArray objectAtIndex:1] valueForKey:@"volume"] floatValue];
                [self adjustZoneVolume:maxVolume];
                NSLog(@"adjustZoneVolume called, node isn't playing and zonePlayer volume needs to be raised");
            }

            if ((nodeIsPlaying == true) && (zonePlayer.volume != 0.200000)) {

                float maxVolume = 0.2;
                [self adjustZoneVolume:maxVolume];
                NSLog(@"adjustZoneVolume called, node is playing and zonePlayer volume needs to be lowered");

            }

顶部的日志始终向控制台打印0.200000。

当nodeIsPlaying设置为true时,即使NOT运算符应防止发生这种情况,也会返回底部条件。

当nodeIsPlaying设置为false时,什么也不会发生。

因此
可能真的很愚蠢...

有任何想法吗?

提前致谢。

最佳答案

对于精度运算,请使用NSDecimalNumber类。

NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithFloat:zonePlayer.volume] decimalValue]];
NSDecimalNumber *number2 = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithFloat:0.2f] decimalValue]];
NSComparisonResult comparisonResult = [number compare:number2];

if ((nodeIsPlaying == false) && (comparisonResult == NSOrderedSame || comparisonResult == NSOrderedDescending)) {

}

07-24 19:48