Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 使用NSDecimalNumber执行While循环_Objective C_Nsdecimalnumber - Fatal编程技术网

Objective c 使用NSDecimalNumber执行While循环

Objective c 使用NSDecimalNumber执行While循环,objective-c,nsdecimalnumber,Objective C,Nsdecimalnumber,我正在将收益率到到期日的计算从使用浮点数转换为小数位数。循环可以工作,但经常挂断。我已提供以下代码: /////////////////////// YTM TEST //////////////////////////////// NSDecimalNumber *years = [NSDecimalNumber decimalNumberWithString:@"10"]; NSLog(@"Years are: %@", years); NSDecimalNumber *temp

我正在将收益率到到期日的计算从使用浮点数转换为小数位数。循环可以工作,但经常挂断。我已提供以下代码:

///////////////////////  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!");

}
}
//YTM测试////////////////////////////////
NSDecimalNumber*年份=[NSDecimalNumber decimalNumberWithString:@“10”];
NSLog(@“年数为:%@”,年);
NSDecimalNumber*temp9=[NSDecimalNumber decimalNumberWithString:@“2”];
NSLog(@“每年优惠券:%@”,temp9);
NSDecimalNumber*temp2=[NSDecimalNumber decimalNumberWithString:@“100”];
NSLog(@“债券价格:%@”,temp2);
NSDecimalNumber*temp3=[NSDecimalNumber decimalnumberwhithstring:@“100”];
NSLog(@“债券面值%@”,temp3);
NSDecimalNumber*temp1=[NSDecimalNumber decimalnumberwhithstring:@“5”];
NSLog(@“票面利率输入:%@”,temp1);
temp1=[temp1 decimalNumberByDividingBy:[nsdecimalnumberdecimalnumberwithstring:@“100”];
NSLog(@“票面利率:%@),temp1
//temp5=0.0;//初始或较低的ytm猜测值
NSDecimalNumber*temp5=[NSDecimalNumber decimalNumberWithString:@“0.0”];
NSLog(@“年初至今计算猜测:%@”,temp5);
NSDecimalNumber*finalCalc=[NSDecimalNumber decimalNumberWithString:@“0.0”];
NSLog(@“初始最终信用价值为:%@”,最终信用);
{
做
{
//如果(计数器<300000)
{
//temp5=temp5+.000005;/.00005;
NSDecimalNumber*常量=[NSDecimalNumber decimalNumberWithString:@.000005];
//NSLog(@“年初至今计算常数:%@”,常数);
temp5=[temp5 decimalNumberByAdding:常量];
//NSLog(@“将常数添加到初始猜测:%@”,temp5);
///计算1和2
NSDecimalNumber*现金流=[[temp3 decimalNumberByMultiplyingBy:temp1]DecimalNumberByDivingBy:temp9];
//NSLog(@“每个息票期的现金流:%@”,现金流);
//计算3
NSDecimalNumber*constantOfOne=[NSDecimalNumber decimalNumberWithString:@“1”];
NSDecimalNumber*onePlusGuess=[temp5 decimalNumberByAdding:constantOfOne];
//NSLog(@“一加猜测:%@”,一加一);
//计算4
N小数*功率=[年小数位数乘:temp9];
//NSLog(@“功率:%@”,功率);
//计算5
NSDecimalNumber*onePlusGuessRaised=[onePlusGuess decimalNumberByRaisingToPower:[功率浮点值];
//NSLog(@“一个加一个的猜测提高到功率:%@”,一个加一个加一个的猜测提高);
//计算6
NSDecimalNumber*dividentone=[constantOfOne decimalNumberByDividingBy:onePlusGuessRaised];
//NSLog(@“分割为一:%@”,分割为一);
//计算7
NSDecimalNumber*complexResult=[constantOfOne decimalNumberBySubtracting:dividentoone];//NSLog(@“complexcalc Result:%@”,complexResult);
//计算8
NSDecimalNumber*divideByGuess=[complexResult decimalNumberByDividingBy:temp5];
//NSLog(@“除以一:%@”,除以猜测);
//计算8
NSDecimalNumber*multipleftside=[现金流decimalNumberByMultiplyingBy:divideByGuess];
//NSLog(@“左侧完成:%@”,多段);
//计算9
NSDecimalNumber*dividentopar=[temp3 decimalNumberByDividingBy:onePlusGuessRaised];
//NSLog(@“分为面值:%@”,分为面值);
//计算10
finalCalc=[多重小数位数相加:除以PAR];
//NSLog(@“计算的最终部分=:%@”,finalCalc);
}
}
而(最终信用证>临时信用证);
NSLog(@“我完了!”);
}
}

我终于解决了上述问题,“Do-While”的处理将停止在各个位置循环。在少数情况下,它将运行2分钟或更长时间。问题是我的“While”语句While(finalCalc>temp2);”不是比较两个NSDecimalNumber的值,而是比较指针地址。经过大量的研究和测试,while语句的正确编码为“while([finalCalc compare:temp2]==nsorDescending);”我已经对此进行了多次测试,测试结果是否完美。我的原始代码将在编译时不会出现错误或警告。

请解释“经常挂起”的含义。崩溃、错误、冻结?日志?是否有迹象表明它每次都在同一点“挂起”?
decimalNumberByRaisingToPower:
似乎需要一个整数,而您是g将其设为浮点数?您没有看到警告吗?很抱歉解释得不好。挂起是指计数器中显示的值“counter=counter+1;”和“NSLog(@“Count:%d”,counter);”出现在语句“while(finalCalc>temp2);”每次重新启动循环时将产生不同的值。值的范围从4到高达489,表示通过循环的次数。虽然每次通过计算正确的值,但循环从未达到finalCalc小于或等于temp2的点。Steve-我将尝试在“decimalNumberByRaisingToPower”数字类型输入并返回。大家好,我终于解决了上述问题,“Do While”过程将在某些地方停止循环。在少数情况下,它将运行2分钟或更长时间。