我有点无聊,所以我把从互联网上得到的月费公式放入使用NSDecimalNumber的代码中。
正如您将看到的,使用 NSDecimalNumbers 是一个很大的问题。但是您正在编写财务软件,而您的客户期望得到正确的结果。
再一次,我指的是 Marcus Zarras 的文章DON'T BE LAZY WITH NSDECIMALNUMBER (LIKE ME)。
请享用。
NSDecimalNumber *loan = [NSDecimalNumber decimalNumberWithString:@"25000"];
NSDecimalNumber *annualInterestRate = [NSDecimalNumber decimalNumberWithString:@"6"]; // 6%
annualInterestRate = [annualInterestRate decimalNumberByDividingBy:[NSDecimalNumber decimalNumberWithString:@"100"]]; // 0.06 i.e. 6%
NSInteger numberOfPayments = 36;
// (loan * (interest / 12)) / (1 - (1 + interest / 12) ^ -number)
// ^^^^^^^^^^^^^ temp1
// ^^^^^^^^^^^^^^^^^^^^^^^^ temp2
// ^^^^^^^^^^^^^ temp1
// ^^^^^^^^^^^^^^^^^^^ temp4
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ temp5
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ temp6
NSDecimalNumber *temp1 = [annualInterestRate decimalNumberByDividingBy:[NSDecimalNumber decimalNumberWithString:@"12"]];
NSDecimalNumber *temp2 = [temp1 decimalNumberByMultiplyingBy:loan];
NSDecimalNumber *temp4 = [[NSDecimalNumber one] decimalNumberByAdding:temp1];
NSDecimalNumber *temp5 = [[NSDecimalNumber one] decimalNumberByDividingBy:[temp4 decimalNumberByRaisingToPower:numberOfPayments]];
NSDecimalNumber *temp6 = [[NSDecimalNumber one] decimalNumberBySubtracting:temp5];
NSDecimalNumber *monthlyRate = [temp2 decimalNumberByDividingBy:temp6];
NSLog(@"Monthly rate: %@", monthlyRate);
希望它是正确的。我通常不必处理 NSDecimalNumbers。