34 CPRoundingMode _roundingMode;
36 BOOL _raiseOnExactness;
37 BOOL _raiseOnOverflow;
38 BOOL _raiseOnUnderflow;
39 BOOL _raiseOnDivideByZero;
80 - (id)initWithRoundingMode:(CPRoundingMode)roundingMode scale:(
short)scale raiseOnExactness:(BOOL)exact raiseOnOverflow:(BOOL)overflow raiseOnUnderflow:(BOOL)underflow raiseOnDivideByZero:(BOOL)divideByZero
82 if (
self = [super init])
84 _roundingMode = roundingMode;
86 _raiseOnExactness = exact;
87 _raiseOnOverflow = overflow;
88 _raiseOnUnderflow = underflow;
89 _raiseOnDivideByZero = divideByZero;
101 + (id)decimalNumberHandlerWithRoundingMode:(CPRoundingMode)roundingMode scale:(
short)scale raiseOnExactness:(BOOL)exact raiseOnOverflow:(BOOL)overflow raiseOnUnderflow:(BOOL)underflow raiseOnDivideByZero:(BOOL)divideByZero
117 + (id)defaultDecimalNumberHandler
134 - (CPRoundingMode)roundingMode
136 return _roundingMode;
170 case CPCalculationNoError:
break;
216 scale:[aCoder decodeIntForKey:CPDecimalNumberHandlerScaleKey]
217 raiseOnExactness:[aCoder decodeBoolForKey:CPDecimalNumberHandlerRaiseOnExactKey]
218 raiseOnOverflow:[aCoder decodeBoolForKey:CPDecimalNumberHandlerRaiseOnOverflowKey]
219 raiseOnUnderflow:[aCoder decodeBoolForKey:CPDecimalNumberHandlerRaiseOnUnderflowKey]
232 [aCoder encodeInt:[
self roundingMode] forKey:CPDecimalNumberHandlerRoundingModeKey];
233 [aCoder encodeInt:[
self scale] forKey:CPDecimalNumberHandlerScaleKey];
234 [aCoder encodeBool:_raiseOnExactness forKey:CPDecimalNumberHandlerRaiseOnExactKey];
235 [aCoder encodeBool:_raiseOnOverflow forKey:CPDecimalNumberHandlerRaiseOnOverflowKey];
236 [aCoder encodeBool:_raiseOnUnderflow forKey:CPDecimalNumberHandlerRaiseOnUnderflowKey];
237 [aCoder encodeBool:_raiseOnDivideByZero forKey:CPDecimalNumberHandlerDivideByZeroKey];
303 return class_createInstance(
self);
321 - (id)initWithDecimal:(CPDecimal)dcm
323 if (
self = [super init])
341 - (id)initWithMantissa:(
unsigned long long)mantissa exponent:(
short)exponent isNegative:(BOOL)flag
343 if (
self = [
self init])
377 if (
self = [
self init])
404 + (
CPDecimalNumber)decimalNumberWithMantissa:(
unsigned long long)mantissa exponent:(
short)exponent isNegative:(BOOL)flag
418 return [[
self alloc] initWithString:numberValue];
439 + (id)defaultBehavior
449 + (void)setDefaultBehavior:(
id <CPDecimalNumberBehaviors>)behavior
527 error =
CPDecimalAdd(result, [
self decimalValue], [decimalNumber decimalValue], [behavior roundingMode]);
529 if (error > CPCalculationNoError)
531 var res = [behavior exceptionDuringOperation:_cmd error:error leftOperand:self rightOperand:decimalNumber];
563 error =
CPDecimalSubtract(result, [
self decimalValue], [decimalNumber decimalValue], [behavior roundingMode]);
565 if (error > CPCalculationNoError)
567 var res = [behavior exceptionDuringOperation:_cmd error:error leftOperand:self rightOperand:decimalNumber];
599 error =
CPDecimalDivide(result, [
self decimalValue], [decimalNumber decimalValue], [behavior roundingMode]);
601 if (error > CPCalculationNoError)
603 var res = [behavior exceptionDuringOperation:_cmd error:error leftOperand:self rightOperand:decimalNumber];
635 error =
CPDecimalMultiply(result, [
self decimalValue], [decimalNumber decimalValue], [behavior roundingMode]);
637 if (error > CPCalculationNoError)
639 var res = [behavior exceptionDuringOperation:_cmd error:error leftOperand:self rightOperand:decimalNumber];
668 - (
CPDecimalNumber)decimalNumberByMultiplyingByPowerOf10:(
short)power withBehavior:(
id <CPDecimalNumberBehaviors>)behavior
673 if (error > CPCalculationNoError)
704 - (
CPDecimalNumber)decimalNumberByRaisingToPower:(
unsigned)power withBehavior:(
id <CPDecimalNumberBehaviors>)behavior
710 error =
CPDecimalPower(result, [
self decimalValue], power, [behavior roundingMode]);
712 if (error > CPCalculationNoError)
728 - (
CPDecimalNumber)decimalNumberByRoundingAccordingToBehavior:(
id <CPDecimalNumberBehaviors>)behavior
732 CPDecimalRound(result, [
self decimalValue], [behavior scale], [behavior roundingMode]);
795 - (CPDecimal)decimalValue
805 - (double)doubleValue
808 return parseFloat([
self stringValue]);
827 return parseInt([
self stringValue]);
837 return parseFloat([
self stringValue]);
847 return parseInt([
self stringValue]);
854 - (
long long)longLongValue
857 return parseInt([
self stringValue]);
867 return parseInt([
self stringValue]);
877 return parseInt([
self stringValue]);
884 - (
unsigned char)unsignedCharValue
887 return parseInt([
self stringValue]);
894 - (
unsigned int)unsignedIntValue
897 return parseInt([
self stringValue]);
904 - (
unsigned long)unsignedLongValue
907 return parseInt([
self stringValue]);
914 - (
unsigned short)unsignedShortValue
917 return parseInt([
self stringValue]);
937 + (id)numberWithBool:(BOOL)aBoolean
939 return [[
self alloc] initWithBool:aBoolean];
947 + (id)numberWithChar:(
char)aChar
949 return [[
self alloc] initWithChar:aChar];
957 + (id)numberWithDouble:(
double)aDouble
959 return [[
self alloc] initWithDouble:aDouble];
967 + (id)numberWithFloat:(
float)aFloat
969 return [[
self alloc] initWithFloat:aFloat];
977 + (id)numberWithInt:(
int)anInt
979 return [[
self alloc] initWithInt:anInt];
987 + (id)numberWithLong:(
long)aLong
989 return [[
self alloc] initWithLong:aLong];
997 + (id)numberWithLongLong:(
long long)aLongLong
999 return [[
self alloc] initWithLongLong:aLongLong];
1007 + (id)numberWithShort:(
short)aShort
1009 return [[
self alloc] initWithShort:aShort];
1017 + (id)numberWithUnsignedChar:(
unsigned char)aChar
1019 return [[
self alloc] initWithUnsignedChar:aChar];
1027 + (id)numberWithUnsignedInt:(
unsigned)anUnsignedInt
1029 return [[
self alloc] initWithUnsignedInt:anUnsignedInt];
1037 + (id)numberWithUnsignedLong:(
unsigned long)anUnsignedLong
1039 return [[
self alloc] initWithUnsignedLong:anUnsignedLong];
1047 + (id)numberWithUnsignedLongLong:(
unsigned long)anUnsignedLongLong
1057 + (id)numberWithUnsignedShort:(
unsigned short)anUnsignedShort
1059 return [[
self alloc] initWithUnsignedShort:anUnsignedShort];
1067 - (id)initWithBool:(BOOL)value
1069 if (
self = [
self init])
1079 - (id)initWithChar:(
char)value
1081 return [
self _initWithJSNumber:value];
1089 - (id)initWithDouble:(
double)value
1091 return [
self _initWithJSNumber:value];
1099 - (id)initWithFloat:(
float)value
1101 return [
self _initWithJSNumber:value];
1109 - (id)initWithInt:(
int)value
1111 return [
self _initWithJSNumber:value];
1119 - (id)initWithLong:(
long)value
1121 return [
self _initWithJSNumber:value];
1129 - (id)initWithLongLong:(
long long)value
1131 return [
self _initWithJSNumber:value];
1139 - (id)initWithShort:(
short)value
1141 return [
self _initWithJSNumber:value];
1149 - (id)initWithUnsignedChar:(
unsigned char)value
1151 return [
self _initWithJSNumber:value];
1159 - (id)initWithUnsignedInt:(
unsigned)value
1161 return [
self _initWithJSNumber:value];
1169 - (id)initWithUnsignedLong:(
unsigned long)value
1171 return [
self _initWithJSNumber:value];
1179 - (id)initWithUnsignedLongLong:(
unsigned long long)value
1181 return [
self _initWithJSNumber:value];
1189 - (id)initWithUnsignedShort:(
unsigned short)value
1191 return [
self _initWithJSNumber:value];
1194 - (id)_initWithJSNumber:value
1196 if (
self = [
self init])
1221 dcm._exponent = [aCoder decodeIntForKey:CPDecimalNumberDecimalExponent];
1222 dcm._isNegative = [aCoder decodeBoolForKey:CPDecimalNumberDecimalIsNegative];
1223 dcm._isCompact = [aCoder decodeBoolForKey:CPDecimalNumberDecimalIsCompact];
1224 dcm._isNaN = [aCoder decodeBoolForKey:CPDecimalNumberDecimalIsNaN];
1225 dcm._mantissa = [aCoder decodeObjectForKey:CPDecimalNumberDecimalMantissa];
1238 [aCoder encodeInt:_data._exponent forKey:CPDecimalNumberDecimalExponent];
1239 [aCoder encodeBool:_data._isNegative forKey:CPDecimalNumberDecimalIsNegative];
1240 [aCoder encodeBool:_data._isCompact forKey:CPDecimalNumberDecimalIsCompact];
1241 [aCoder encodeBool:_data._isNaN forKey:CPDecimalNumberDecimalIsNaN];
1242 [aCoder encodeObject:_data._mantissa forKey:CPDecimalNumberDecimalMantissa];