我正在将收益率转换为成熟度计算,从使用浮点数转换为NSDecimalNumbers。循环工作,但经常挂断。我提供了以下守则:
/////////////////////// YTM TEST ////////////////////////////////
NSDecimalNumber *years = [NSDecimalNumber decimalNumberWithString:@"10"];
NSLog(@"Years are: %@", years);
NSDecimalNumber *temp9 = [NSDecimalNumber decimalNumberWithString:@"2"];
NSLog(@"Coupons per Year: %@", temp9);
NSDecimalNumber *temp2 = [NSDecimalNumber decimalNumberWithString:@"100"];
NSLog(@"Bond Price: %@", temp2);
NSDecimalNumber *temp3 = [NSDecimalNumber decimalNumberWithString:@"100"];
NSLog(@"Bond Par: %@", temp3);
NSDecimalNumber *temp1 = [NSDecimalNumber decimalNumberWithString:@"5"];
NSLog(@"Coupon Interest Rate Input: %@", temp1);
temp1 = [temp1 decimalNumberByDividingBy:[NSDecimalNumber decimalNumberWithString:@"100"]];
NSLog(@"Coupon Interest Rate: %@", temp1
//temp5 = 0.0; // the initial or lower ytm guess
NSDecimalNumber *temp5 = [NSDecimalNumber decimalNumberWithString:@"0.0"];
NSLog(@"Initial YTM Calc Guess: %@", temp5);
NSDecimalNumber *finalCalc = [NSDecimalNumber decimalNumberWithString:@"0.0"];
NSLog(@"Initial finalCalc Value is: %@", finalCalc);
{
do
{
//if (counter < 300000)
{
//temp5 = temp5 + .000005; // .00005;
NSDecimalNumber *constant = [NSDecimalNumber decimalNumberWithString:@".000005"];
//NSLog(@"YTM Calc Constant: %@", constant);
temp5 = [temp5 decimalNumberByAdding:constant];
//NSLog(@"Add Constant to Initial Guess: %@", temp5);
/// Calc 1 & 2
NSDecimalNumber *cashFlow = [[temp3 decimalNumberByMultiplyingBy:temp1]decimalNumberByDividingBy:temp9];
//NSLog(@"Cashflow per Coupon Period: %@", cashFlow);
//Calc 3
NSDecimalNumber *constantOfOne = [NSDecimalNumber decimalNumberWithString:@"1"];
NSDecimalNumber *onePlusGuess = [temp5 decimalNumberByAdding:constantOfOne];
//NSLog(@"One Plus Guess: %@", onePlusGuess);
// Calc 4
NSDecimalNumber *thePower = [years decimalNumberByMultiplyingBy:temp9];
//NSLog(@"thePower: %@", thePower);
// Calc 5
NSDecimalNumber *onePlusGuessRaised = [onePlusGuess decimalNumberByRaisingToPower:[thePower floatValue]];
//NSLog(@"One Plus Guess Raised to Power: %@", onePlusGuessRaised);
// Calc 6
NSDecimalNumber *divideIntoOne = [constantOfOne decimalNumberByDividingBy:onePlusGuessRaised];
//NSLog(@"Divide into One: %@", divideIntoOne);
//Calc 7
NSDecimalNumber *complexResult = [constantOfOne decimalNumberBySubtracting:divideIntoOne]; //NSLog(@"Complex Calc Result: %@", complexResult);
// Calc 8
NSDecimalNumber *divideByGuess = [complexResult decimalNumberByDividingBy:temp5];
//NSLog(@"Divide into One: %@", divideByGuess);
//Calc 8
NSDecimalNumber *multipleLeftSide = [cashFlow decimalNumberByMultiplyingBy:divideByGuess];
//NSLog(@"left Side Done: %@", multipleLeftSide);
//Calc 9
NSDecimalNumber *divideIntoPar = [temp3 decimalNumberByDividingBy:onePlusGuessRaised];
//NSLog(@"Divide into Par: %@", divideIntoPar);
//Calc 10
finalCalc = [multipleLeftSide decimalNumberByAdding:divideIntoPar];
// NSLog(@"Final part of Calc = : %@", finalCalc);
}
}
while (finalCalc > temp2);
NSLog(@"I'm Done!");
}
}发布于 2014-08-13 22:27:05
我终于解决了“边做边做”的处理在不同地方停止循环的问题。在一些情况下,它会运行2分钟或更长时间。问题是,我的"While“语句while (finalCalc >temp2)不是比较两个NSDecimalNumbers的值,而是比较指针地址。经过大量的研究和测试,while语句的正确编码是"while (finalCalc compare:temp2 2 == NSOrderedDescending);“,我已经多次测试过它是否工作得很好。我的原始代码编译时不会出现错误或警告。
https://stackoverflow.com/questions/25168580
复制相似问题