0

假设我对这些 ivars 有以下值:

NSString* 百分比 = 35 NSString* 值 = 146

在下面的代码中,当我进行乘法 (146*.35) 时,我期望得到 51.1,但得到的是 100。

- (NSDecimalNumber*) getProductByPercentage : (NSArray*) itemsToMultiply : (float) annualPatients {

    //get items from array
    NSString* percentage = [itemsToMultiply objectAtIndex:0];
    NSString* value = [itemsToMultiply objectAtIndex:1];

    //init a number formatter
    NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
    //set its formatting style
    [f setNumberStyle:NSNumberFormatterDecimalStyle];

    //convert to percentage
    float thisPercentage = [percentage floatValue]/100;

    //convert to NSDecimal
    NSDecimalNumber* decPercentage = [[NSDecimalNumber alloc] initWithString:[NSString stringWithFormat:@"%f",  thisPercentage]];
    NSDecimalNumber* decAvgReimbursement = [[NSDecimalNumber alloc] initWithString: value];
    NSDecimalNumber* decAnnualPatients = [[NSDecimalNumber alloc] initWithString:[NSString stringWithFormat:@"%f", annualPatients]];

    //set up handler
    NSDecimalNumberHandler *handler = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain
            scale:-2
            raiseOnExactness:NO
            raiseOnOverflow:NO
            raiseOnUnderflow:NO
            raiseOnDivideByZero:NO
    ];

    //get our results
    NSDecimalNumber* decAvgCost = [decAvgReimbursement decimalNumberByMultiplyingBy:decPercentage
                                                                 withBehavior:handler];

    NSLog(@"%@::%@::%@", decAvgCost, decAvgReimbursement, decPercentage);

    return decAvgCost;
}

这是我的日志输出

2013-02-04 13:57:46.960 EUS Calculator[34154:c07] 100::146::0.35

我的处理程序有什么问题导致我得到错误的结果吗?

4

3 回答 3

2
scale:-2

您将比例设置为四舍五入到小数点后 -2,即最接近的 100。

于 2013-02-04T19:06:42.327 回答
1

你四舍五入到错误的比例。尝试将比例更改为 0(删除小数点),然后重试。如果您想要 1 个小数位,请使用 1;那么你应该得到 51.1。

于 2013-02-04T19:05:14.440 回答
1

改变这个:

float thisPercentage = [percentage floatValue]/100;

对此:

float thisPercentage = [percentage floatValue]/100.0;

如果您不输入 .0,那么编译器会将其解释为整数,并且在执行 float/int 时会将其转换为 int,从而将您预期的 0.35 转换为 0。

此外,您没有在任何地方使用 NSNumberFormatter,因此您甚至可以不创建它。

你为什么还要使用NSDecimalNumbers

于 2013-02-04T19:05:54.783 回答