温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

iOS中double/float数据计算精度的示例分析

发布时间:2021-08-26 14:16:46 来源:亿速云 阅读:140 作者:小新 栏目:移动开发

这篇文章将为大家详细讲解有关iOS中double/float数据计算精度的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

1、我们的app有一个判断,当用户输入的值,小于等于剩余的余额时,给用户弹窗,代码不往下执行

当用户输入 0.01 时,po 一下的结果是:0.10000.... ,当用户的余额是0.01时,po一下网络请求的返回结果是:0.009999...

当用户输入 66.05时,po  一下的结果是:66.049999...,当用户的余额是66.05时,po一下网络请求的返回结果是:66.049999...

所以,当数据较大时,不会有影响,因为用户输入的数据和网络返回数据都被变成了不精确的小值了;但是,当数据较小时,用户输入的数据没有被转,网络返回的数据被转成了不精确的小值,导致用户输入永远大于网络返回的数据,代码无法往下执行;

解决:使用 NSDecimalNumber 将float、double数据转化成NSDecimalNumber 类型的对象进行 +、-、*、/计算,再取值。

- (double)DecimalNumber:(double)num1 num2:(double)num2 {        NSDecimalNumber *n1 = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%f",num1]];        NSDecimalNumber *n2 = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%f",num2]];        NSDecimalNumber *n3 = [n1 decimalNumberBySubtracting:n2];        return n3.doubleValue;  }  // 调用:  double result = [self DecimalNumber: 2.01 num2: 2]; // 结果为 0.01

其中:
decimalNumberBySubtracting: n1 - n2,返回 n1 - n2 的结果值
decimalNumberByMultiplyingBy:n1 * n2,
decimalNumberByDividingBy:n1 / n2,
decimalNumberByAdding:n1 + n2,
compare:比较 n1 和 n2,返回比较结果;

2、进行数据的四舍五入获得结果 

- (NSString*)Rounding:(float)number afterPoint:(NSInteger)position  {    NSDecimalNumberHandler *handler = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode: NSRoundPlain scale: position raiseOnExactness: NO raiseOnOverflow: NO raiseOnUnderflow:NO raiseOnDivideByZero: NO];        NSDecimalNumber *floatDecimal = [[NSDecimalNumber alloc] initWithFloat: number];        NSDecimalNumber *resultNumber = [floatDecimal decimalNumberByRoundingAccordingToBehavior:handler];        return [NSString stringWithFormat:@"%@",resultNumber];  }  // 调用:  NSString *result = [self Rounding:8.00092 afterPoint:3]; // 结果为 8.001

其中,参数number是需要四舍五入的数据,position是小数点后保留的位数;

高精度要求

使用系统提供的NSDecimalNumber API进行计算,最后转换为字符串输出显示。NSDecimalNumber转换方法:

#import "NSDecimalNumber+Y_Add.h" @implementation NSDecimalNumber (Y_Add) + (NSDecimalNumber *)y_decimalNumberWithFloat:(float)value{      return [self y_decimalNumberWithFloat:value scale:2]; } + (NSDecimalNumber *)y_decimalNumberWithFloat:(float)value scale:(short)scale{      return [self y_decimalNumberWithFloat:value roundingMode:NSRoundBankers scale:scale]; } + (NSDecimalNumber *)y_decimalNumberWithFloat:(float)value roundingMode:(NSRoundingMode)roundingMode scale:(short)scale{      return [[[NSDecimalNumber alloc] initWithFloat:value] y_decimalNumberHandlerWithRoundingMode:roundingMode scale:scale]; } + (NSDecimalNumber *)y_decimalNumberWithDouble:(double)value{      return [self y_decimalNumberWithDouble:value scale:2]; } + (NSDecimalNumber *)y_decimalNumberWithDouble:(double)value scale:(short)scale{      return [self y_decimalNumberWithDouble:value roundingMode:NSRoundBankers scale:scale]; } + (NSDecimalNumber *)y_decimalNumberWithDouble:(double)value roundingMode:(NSRoundingMode)roundingMode scale:(short)scale{      return [[[NSDecimalNumber alloc] initWithFloat:value] y_decimalNumberHandlerWithRoundingMode:roundingMode scale:scale]; }   /**  * <#Description#>  *  * @return <#return value description#>  */ - (NSDecimalNumber *)y_decimalNumberHandler{      return [self y_decimalNumberHandlerWithRoundingMode:NSRoundBankers scale:2]; } - (NSDecimalNumber *)y_decimalNumberHandlerWithRoundingMode:(NSRoundingMode)roundingMode scale:(short)scale{    NSDecimalNumberHandler *handler = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:roundingMode                                                scale:scale                                          raiseOnExactness:NO                                           raiseOnOverflow:YES                                          raiseOnUnderflow:YES                                         raiseOnDivideByZero:YES];   return [self decimalNumberByRoundingAccordingToBehavior:handler]; } @end

普通精度要求

使用系统提供的数学运算进行计算,最后转换为字符串输出显示。保留小数点后N位的方法:

/**  * formatterNumber .00 小数点后两位  *  * @param number <#number description#>  *  * @return <#return value description#>  */ + (NSString *)y_formatterNumber:(NSNumber *)number{      return [self y_formatterNumber:number fractionDigits:2]; } + (NSString *)y_formatterNumber:(NSNumber *)number fractionDigits:(NSUInteger)fractionDigits{        NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];   [numberFormatter setMaximumFractionDigits:fractionDigits];   [numberFormatter setMinimumFractionDigits:fractionDigits];      return [numberFormatter stringFromNumber:number]; }

关于“iOS中double/float数据计算精度的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI