类似于stringByAppendingString的double

时间:2014-03-03 14:41:42

标签: ios iphone objective-c math

我正在尝试制作计算器应用。我希望它符合操作顺序等等。我想这样做的方法是在按下操作时将数字和操作添加到double的末尾。我找不到任何方法将数字和操作(+, - ,*,/)添加到double的末尾,或者在objective c中的任何数字相关类。

如果您知道有任何方法可以做到这一点,或者对如何做到这一点有不同的想法,这将是非常棒的。感谢。

2 个答案:

答案 0 :(得分:2)

这在许多层面上都不是一个好方法。首先,只需在数字的“结尾”添加操作(无论你的意思是“结束”在这里)都不会让你进入操作顺序。您需要跟踪整个表达式(或至少不仅仅是最后一个操作数)。由于您在ObjC工作,您可能需要一种面向对象的方法来管理表达式。谷歌为“面向对象的计算器”。有很多例子。 (不要担心示例是否在ObjC中;您应该能够在任何OOP语言中应用相同的对象模型。)@ ordjanfoe提供了这个的开头,但是正确的操作顺序更复杂。幸运的是,它已经解决了很多次。有关一个ObjC解决方案,请参阅DDMathParser

接下来要咬你的是double是计算器的危险类型。您的用户希望在Base-10中工作。 double在Base-2中运行。会出现舍入错误,当你清楚地意味着5时,结果会像4.999999999那样结束。如果你打算显示小数,那么就用十进制表示。 Cocoa为此提供NSDecimalNumber类,以及NSDecimal基础类型。

答案 1 :(得分:0)

当用户输入操作时,您需要收集它们,因此每个操作都需要一个自定义对象:

typedef enum {
    CalcOperatonTypeValue,    // value is valid
    CalcOperatonTypeAdd,      // +
    CalcOperatonTypeSub,      // -
    CalcOperatonTypeMult,     // *
    CalcOperatonTypeDiv       // %
} CalcOperationType;

@interface CalcOperation : NSObject
@property (assign) CalcOperationType type;
@property (assign) double value;
@end

然后在用户执行操作时将这些数据收集到一个可变数组中(请注意CalcOperation.value仅在typeCalcOperatonTypeValue时有效)。

然后当你想知道当前值是什么(显示)时,执行以下操作:

double total = 0.0, lastValue = 0.0;
for (CalcOperation *op in operations) {
    switch (op.type) {
    case CalcOperatonTypeValue:
        lastValue = op.value;
        break;
    case CalcOperatonTypeAdd:
        total += lastValue;
        break;
    case CalcOperatonTypeSub:
        total -= lastValue;
        break;
    case CalcOperatonTypeMult:
        total *= lastValue;
        break;
    case CalcOperatonTypeDiv:
        total /= lastValue;
        break;
    default:
        NSAssert(NO, @"Invalid operation type");
        break;
    }
}

注意:在此变为稳定之前,需要进行更多的错误检查。