注意:该文章在学习CorePlot框架时编写,仅供学习使用,以下为NSDecimal所有的方法及使用样例,及说明。
复制
- NSDecimalCopy
比较
- NSDecimalCompare
加减乘除 四舍五入
- NSDecimalAdd
- NSDecimalSubtract
- NSDecimalMultiply
- NSDecimalDivide
- NSDecimalRound
N次方
- NSDecimalPower
10的N次方
- NSDecimalMultiplyByPowerOf10
转化成字符串
- NSDecimalString
其他
- NSDecimalCompact
- NSDecimalIsNotANumber
- NSDecimalNormalize
逻辑判断比较大小
NSDecimalCompare(比较大小)
//比较
FOUNDATION_EXPORT NSComparisonResult NSDecimalCompare(const NSDecimal *leftOperand, const NSDecimal *rightOperand);
// NSDecimalCompare:Compares leftOperand and rightOperand.
示例代码:比较两个NSDecimal类型是否左侧大于右侧数值
BOOL CPTDecimalGreaterThan(NSDecimal leftOperand, NSDecimal rightOperand)
{
return NSDecimalCompare(&leftOperand, &rightOperand) == NSOrderedDescending;
}
比较结果
typedef NS_ENUM(NSInteger, NSComparisonResult) {
NSOrderedAscending = -1L, //升序排列
NSOrderedSame, //相等
NSOrderedDescending//降序排列
};
算数运算
NSDecimalAdd(加)
//加法
FOUNDATION_EXPORT NSCalculationError NSDecimalAdd(NSDecimal *result, const NSDecimal *leftOperand, const NSDecimal *rightOperand, NSRoundingMode roundingMode);
示例代码:
NSDecimal CPTDecimalAdd(NSDecimal leftOperand, NSDecimal rightOperand)
{
NSDecimal result;
NSDecimalAdd(&result, &leftOperand, &rightOperand, NSRoundBankers);
return result;
}
NSDecimalSubtract(减)
//减法
FOUNDATION_EXPORT NSCalculationError NSDecimalSubtract(NSDecimal *result, const NSDecimal *leftOperand, const NSDecimal *rightOperand, NSRoundingMode roundingMode);
示例代码:
NSDecimal CPTDecimalSubtract(NSDecimal leftOperand, NSDecimal rightOperand)
{
NSDecimal result;
NSDecimalSubtract(&result, &leftOperand, &rightOperand, NSRoundBankers);
return result;
}
NSDecimalMultiply(乘)
//乘法
FOUNDATION_EXPORT NSCalculationError NSDecimalMultiply(NSDecimal *result, const NSDecimal *leftOperand, const NSDecimal *rightOperand, NSRoundingMode roundingMode);
示例代码:
NSDecimal CPTDecimalMultiply(NSDecimal leftOperand, NSDecimal rightOperand)
{
NSDecimal result;
NSDecimalMultiply(&result, &leftOperand, &rightOperand, NSRoundBankers);
return result;
}
NSDecimalDivide(除)
FOUNDATION_EXPORT NSCalculationError NSDecimalDivide(NSDecimal *result, const NSDecimal *leftOperand, const NSDecimal *rightOperand, NSRoundingMode roundingMode);
示例代码:
NSDecimal CPTDecimalDivide(NSDecimal numerator, NSDecimal denominator)
{
NSDecimal result;
NSDecimalDivide(&result, &numerator, &denominator, NSRoundBankers);
return result;
}
NSDecimalRound(四舍五入)
四舍五入NSRoundingMode模式
/*************** Type definitions ***********/
// Rounding policies :舍入策略
// Original
// value 1.2 1.21 1.25 1.35 1.27
// Plain 1.2 1.2 1.3 1.4 1.3
// Down 1.2 1.2 1.2 1.3 1.2
// Up 1.2 1.3 1.3 1.4 1.3
// Bankers 1.2 1.2 1.2 1.4 1.3
typedef NS_ENUM(NSUInteger, NSRoundingMode) {
NSRoundPlain, // Round up on a tie 用于四舍五入
NSRoundDown, // Always down == truncate只舍不入
NSRoundUp, // Always up不舍只入
NSRoundBankers //用于四舍五入,但是只有大于小数为6~9才进位
};
对应的方法:
//参数1:输出的结果
//参数2:输入的值
//参数3:保留到小数点后几位,传入NSInteger类型
//参数4:舍入策略
FOUNDATION_EXPORT void NSDecimalRound(NSDecimal *result, const NSDecimal *number, NSInteger scale, NSRoundingMode roundingMode);
测试示例代码:测试NSRoundBankers
for (int i = 0 ; i<10; i++) {
NSString *str =[NSString stringWithFormat:@"1.22%d",i];
NSLog(@"小数值:%@\n",str);
NSDecimal result;
NSScanner *theScanner = [[NSScanner alloc] initWithString:str];
[theScanner scanDecimal:&result];
NSDecimal coord = result;
NSDecimalRound(&coord, &coord, 2, NSRoundBankers);
CGFloat coordFloat = [[NSDecimalNumber decimalNumberWithDecimal: coord] doubleValue];
NSLog(@"结 果:%f",coordFloat);
}
执行结果:
小数值:1.220
结 果:1.220000
小数值:1.221
结 果:1.220000
小数值:1.222
结 果:1.220000
小数值:1.223
结 果:1.220000
小数值:1.224
结 果:1.220000
小数值:1.225
结 果:1.220000
小数值:1.226
结 果:1.230000
小数值:1.227
结 果:1.230000
小数值:1.228
结 果:1.230000
小数值:1.229
结 果:1.230000
NSDecimalPower(N次方)
//参数1:输出的结果
//参数2:输入的值
//参数3:N次方,传入NSInteger类型
//参数4:舍入策略,这个参数对输出结果有用,但不知道为啥结果是小数点后6位数
FOUNDATION_EXPORT NSCalculationError NSDecimalPower(NSDecimal *result, const NSDecimal *number, NSUInteger power, NSRoundingMode roundingMode);
示例代码:
for (int i = 0 ; i<2; i++) {
NSString *str =[NSString stringWithFormat:@"1.22%d",i];
NSLog(@"小数值:%@\n",str);
NSDecimal result;
NSScanner *theScanner = [[NSScanner alloc] initWithString:str];
[theScanner scanDecimal:&result];
NSDecimal coord;
NSDecimalCopy(&coord,&result);
NSDecimalPower(&coord, &coord, 3, NSRoundPlain);
CGFloat coordFloat = [[NSDecimalNumber decimalNumberWithDecimal: coord] doubleValue];
NSLog(@"结 果:%f",coordFloat);
}
输出结果:
小数值:1.220
结 果:1.815848
小数值:1.221
结 果:1.820317
NSDecimalMultiplyByPowerOf10(10的N次方倍)
for (int i = 0 ; i<2; i++) {
NSString *str =[NSString stringWithFormat:@"1.22%d",i];
NSLog(@"小数值:%@\n",str);
NSDecimal result;
NSScanner *theScanner = [[NSScanner alloc] initWithString:str];
[theScanner scanDecimal:&result];
NSDecimal coord;
NSDecimalCopy(&coord,&result);
NSDecimalMultiplyByPowerOf10(&coord, &coord, 4, NSRoundPlain);
CGFloat coordFloat = [[NSDecimalNumber decimalNumberWithDecimal: coord] doubleValue];
NSLog(@"结 果:%f",coordFloat);
}
输出结果:
小数值:1.220
结 果:12200.000000
小数值:1.221
结 果:12210.000000
NSDecimalString(转化成字符串)
//参数1:要转化的NSDecimal值
//参数2:选择转化的国家语言
FOUNDATION_EXPORT NSString *NSDecimalString(const NSDecimal *dcm, id __nullable locale);
代码示例一:法文输出
for (int i = 0 ; i<2; i++) {
NSString *str =[NSString stringWithFormat:@"1.22%d",i];
NSLog(@"小数值:%@\n",str);
NSDecimal result;
NSScanner *theScanner = [[NSScanner alloc] initWithString:str];
[theScanner scanDecimal:&result];
NSDecimal coord;
NSDecimalCopy(&coord,&result);
NSLocale *locale =[[NSLocale alloc] initWithLocaleIdentifier:@"fr_FR"];
NSLog(@"%@",NSDecimalString(&coord, locale));
}
输出结果:
小数值:1.220
1,22
小数值:1.221
1,221
代码示例二:中国语言
//只需替换该句代码即可
NSLocale *locale =[NSLocale currentLocale];
输出结果:
小数值:1.220
1.22 //有“,”号变为“.”号
小数值:1.221
1.221