代码之家  ›  专栏  ›  技术社区  ›  Slee

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

  •  7
  • Slee  · 技术社区  · 15 年前

    对我来说,最简单的东西在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 回复  |  直到 15 年前
        1
  •  10
  •   falconcreek    15 年前

    标准运算符不能与一起使用 NSDecimalNumber

    NSDecimalNumber *one = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithInt:100] decimalValue]]; 
    NSDecimalNumber *factor = [one decimalNumberBySubtracting:[NSDecimalNumber decimalNumberWithDecimal:[client.PricingDiscount decimalValue]]];
    NSDecimalNumber *showPrice = [sku.RetailPrice decimalNumerByMultiplying:factor];
    
        2
  •  3
  •   shosti    15 年前

    NSDecimalNumber

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

    这很混乱,但是 NSNumber N小数 是C类型的Objective-C包装器,通常用于存储在容器对象中,例如 NSArray (或核心数据)。 NSInteger NSDecimal 另一方面,是C类型( 只是映射到 int ).

    Falconscreek的答案更能避免精度损失。不过,在处理整数时,通常会使用未装箱的C类型。

        3
  •  0
  •   Shaggy Frog    15 年前
    NSDecimalNumber *showPrice = sku.RetailPrice * (100 - client.PricingDiscount);
    

    NSDecimalNumber 是一个班级。这里要做的是计算一个值,然后将其赋值为指向 N小数 对象。这是糟糕的魔法。

    我没用过 N小数 以前,但是如果你需要特定的对象,你想要的是这样的:

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