Integer和NSDecimalNumber的基本数学问题 - 二进制的操作数无效

时间:2010-08-24 17:30:27

标签: iphone objective-c

对于我来说,最简单的东西在Objective-C中看起来总是那么疯狂,无论如何我需要做一些基本的减法和乘法而且难以接受。

我有:

client.PricingDiscount <-- this is an Integer 16 property on a CoreData NSManagedObject
sku.RetailPrice <-- this is a Decimal property on a CoreData NSManagedObject

我只是想让NSDecimalNumber像这样显示:

NSDecimalNumber *showPrice = sku.RetailPrice * (100 - client.PricingDiscount);

我尝试了很多不同形式的这个,但无法弄清楚我在这里做错了什么。

3 个答案:

答案 0 :(得分:10)

标准运算符不能与NSDecimalNumber

一起使用
NSDecimalNumber *one = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithInt:100] decimalValue]]; 
NSDecimalNumber *factor = [one decimalNumberBySubtracting:[NSDecimalNumber decimalNumberWithDecimal:[client.PricingDiscount decimalValue]]];
NSDecimalNumber *showPrice = [sku.RetailPrice decimalNumerByMultiplying:factor];

答案 1 :(得分:3)

NSDecimalNumber是数字的对象包装器 - 您将其视为C值。相反,尝试:

float price = [sku.retailPrice floatValue] * (100 - [client.pricingDiscount floatValue]);
NSDecimalNumber *showPrice = [NSDecimalNumber numberWithFloat:price];

令人困惑,但NSNumberNSDecimalNumber是C类型的Objective-C包装器,通常用于存储容器对象,例如NSArray(或核心数据)。另一方面,NSIntegerNSDecimal是C类型(NSInteger只映射到int)。

编辑: falconcreek的答案更能避免准确性损失。但是,在使用整数时,通常会使用未装箱的C类型。

答案 2 :(得分:0)

NSDecimalNumber *showPrice = sku.RetailPrice * (100 - client.PricingDiscount);

NSDecimalNumber是一个班级。你在这里做的是计算一个值,然后将其指定为指向NSDecimalNumber对象的指针的值。这是坏事。

之前我没有使用NSDecimalNumber,但是如果你需要那个特定的对象,你想要的是这样的:

NSNumber* number = [NSNumber numberWithFloat:(sku.RetailPrice * (100 - client.PricingDiscount))];
NSDecimal* decimal = [number decimalValue];
NSDecimalNumber* showPrice = [NSDecimalNumber decimalNumberWithDecimal:decimal];