iOS 浮点数运算和四舍五入

/ 0评 / 0

最近使用百度地图,用到计算两点距离的问题,为了显示方便点,就想着给四舍五入,精确计算一下,以下直接贴代码,简洁明了。

1. float强转double

float a = 0.01;
int b = 9999;
double c = (double)a*(double)b;
NSLog(@"%f",c); //输出结果为 99.989998
NSLog(@"%.2f",c); //输出结果为 99.99

2.

float a = 0.001;
int b = 999999;
NSString *objA = [NSString stringWithFormat:@"%.3f", (double)a];
NSString *objB = [NSString stringWithFormat:@"%.2f", (double)b];

double c = [objA doubleValue] * [objB doubleValue];
NSLog(@"%f",c); //输出结果为 999.999000
NSLog(@"%.3f",c); //输出结果为 999.999

3.使用NSDecimalNumber-十进制数,继承于NSNumber
3.1 mantissa:长整形;exponent:指数;flag:正负数。

+ (NSDecimalNumber *)decimalNumberWithMantissa:(unsigned long long)mantissa exponent:(short)exponent isNegative:(BOOL)flag;

3.2 基本运算
RoundingMode 四舍五入模式,有四个值:

NSRoundPlain, // Round up on a tie
NSRoundDown, // Always down == truncate
NSRoundUp, // Always up
NSRoundBankers

scale 结果保留几位小数

raiseOnExactness 发生精确错误时是否抛出异常,一般为NO
raiseOnOverflow 发生溢出错误时是否抛出异常,一般为NO
raiseOnUnderflow 发生不足错误时是否抛出异常,一般为NO
raiseOnDivideByZero 被0除时是否抛出异常,一般为YES

NSDecimalNumberHandler *roundUp = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundDown scale:2 raiseOnExactness:NO 
raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:YES];

NSDecimalNumber *a = [NSDecimalNumber decimalNumberWithString:@"15.33"];
NSDecimalNumber *b = [NSDecimalNumber decimalNumberWithString:@"12.022"];
// 加
NSDecimalNumber *sum = [a decimalNumberByAdding:b];
// 减
NSDecimalNumber *subtract = [a decimalNumberBySubtracting:b];
// 乘
NSDecimalNumber *multiply = [a decimalNumberByMultiplyingBy:b];
// 除
NSDecimalNumber *divide = [a decimalNumberByDividingBy:b];
// n次方
NSDecimalNumber *squared = [a decimalNumberByRaisingToPower:2];
// 指数运算
NSDecimalNumber *exponent = [a decimalNumberByMultiplyingByPowerOf10:2];
// 四舍五入
NSDecimalNumber *roundoff = [b decimalNumberByRoundingAccordingToBehavior:roundUp];

NSLog(@"加: %@", sum); // 和: 27.352
NSLog(@"减: %@", subtract); // 差: 3.308
NSLog(@"乘: %@", multiply); // 积: 479.78002
NSLog(@"除: %@", divide); // 除: 1.2751622026285143902844784561636998835
NSLog(@"n次方: %@", squared); // n次方: 235.0089
NSLog(@"指数: %@", exponent); // 指数: 1533
NSLog(@"四舍五入: %@", roundoff); // 四舍五入: 12.02

3.3 比较运算

NSDecimalNumber *discount1 = [NSDecimalNumber decimalNumberWithString:@"1.2"];
NSDecimalNumber *discount2 = [NSDecimalNumber decimalNumberWithString:@"1.3"];
NSComparisonResult result = [discount1 compare:discount2];
if (result == NSOrderedAscending) {
NSLog(@"1.2 < 1.3");
}else if (result == NSOrderedSame)
{
NSLog(@"1.2 == 1.3");
}else if (result == NSOrderedDescending)
{
NSLog(@"1.2 > 1.3");
}

评论已关闭。