美文网首页
iOS开发中的小数取精度(四舍五入)

iOS开发中的小数取精度(四舍五入)

作者: Keizo | 来源:发表于2017-10-24 17:26 被阅读0次

应用背景

今天,测试小姐姐跟我反馈四舍五入的数据不对,我研究后发现,之前编码随手使用了%.2f来实现取两位小数的方法,而这种方法在iOS中并非是严格地四舍五入取两位小数,而是使用了“银行家算法”。

  • 举个栗子:
    NSLog(@"%.2f -- %.2f", 1.625, 1.635); 
    
    得到结果为:
    1.62 -- 1.64
    
  • 简洁点,用一句口诀可以概括“银行家算法”:
    四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一
    
  • 然而我们需求的是四舍五入

解决方案

  1. NSDecimalNumber作为NSNumber的一个不可变子类,是苹果针对浮点型计算时存在精度计算误差的问题而提供的一个计算类,它是基于10进制的定点计算保证了精度不会缺失。同时也可以定制精度的取正类型:向上取正、向下去正、四舍五入等。相对与浮点类型的计算,NSDecimalNumber提供了更加精准的计算。
  • 用此方法进行四舍五入取两位小数的用法如下:
NSDecimalNumberHandler *behavior = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain scale:2 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:NO];
NSDecimalNumber *numResult1 = [NSDecimalNumber decimalNumberWithString:@"1.6350"];
NSLog(@"%@", [numResult1 decimalNumberByRoundingAccordingToBehavior:behavior]);
NSDecimalNumber *numResult2 = [NSDecimalNumber decimalNumberWithString:@"1.6250"];
NSLog(@"%@", [numResult2 decimalNumberByRoundingAccordingToBehavior:behavior]);
  1. 用c语言的算法
(floatValue * 100 + 0.5) / 100;

相关文章

  • iOS开发中的小数取精度(四舍五入)

    应用背景 今天,测试小姐姐跟我反馈四舍五入的数据不对,我研究后发现,之前编码随手使用了%.2f来实现取两位小数的方...

  • js取整数

    js中对小数进行取整 对多位小数进行四舍五入的方法: jquery的tofixed()保留两位小数

  • js取两位小数不四舍五入

    取两位小数,直接用toFixed(2);保留两位小数点,但是会四舍五入。如果不要四舍五入,并且一定要取2位小数,即...

  • 初级_NSDecimalNumber 十进制数计算

    由于使用Double计算经常会在小数点后精度问题和上取整、下取整、四舍五入方面出现问题,所以决定使用十进制数做金额...

  • iOS 浮点数的精确计算和四舍五入问题

    iOS开发中,使用浮点数(float,double)类型运算需要注意计算精度的问题。即使只是两位小数,也会出现误差...

  • iOS中小数取整时尾数的处理

    舍去小数点后面的尾数 向下取整 向上取整 四舍五入

  • java中的三种取整函数

    java中的三种取整函数 舍掉小数取整:Math.floor(3.5)=3 四舍五入取整:Math.rint(3....

  • Python小数点精度控制

    问题描述:Python中在小数精度控制是最常用便捷的是round,但round并不是简单的四舍五入,而是ROUND...

  • NSDecimalNumber的用法

    在iOS开发中,和货币价格计算相关的,需要注意计算精度的问题。即使只是两位小数,也会出现误差。使用float类型运...

  • NSDecimalNumber数字精确

    在iOS开发中,和货币价格计算相关的,需要注意计算精度的问题。即使只是两位小数,也会出现误差。使用float类型运...

网友评论

      本文标题:iOS开发中的小数取精度(四舍五入)

      本文链接:https://www.haomeiwen.com/subject/ajgtpxtx.html