zoukankan      html  css  js  c++  java
  • Objective-C 精确计算

    在iOS中需要精确计算时,double, float类型往往会出现不可预料的问题:

      在调试过程中可以看到 doule 类型 d3 在计算过程中值不是预计的9999.99。

      如果在要用中计算涉及到金额等重要数据,不建议使用这种不可控结果的方式,可以采用iOS提供的另外一种支持准确精度计算的数据类型 NSDecimalNumber.

      NSDecimalNumber是NSNumber的子类,比NSNumber的功能更为强大,可以指定一个数的幂,四舍五入等操作。由于NSDecimalNumber精度较高,所以会比基本数据类型费时,所以需要权衡考虑,苹果官方建议在货币以及要求精度很高的场景下使用。

      所有NSDecimalNumber对象是不可变的,这意味着已经被创建后不能改变它们的值。

    - (NSDecimalNumber *)decimalNumberByAdding:(NSDecimalNumber *)decimalNumber;
    - (NSDecimalNumber *)decimalNumberByAdding:(NSDecimalNumber *)decimalNumber withBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior;
    
    - (NSDecimalNumber *)decimalNumberBySubtracting:(NSDecimalNumber *)decimalNumber;
    - (NSDecimalNumber *)decimalNumberBySubtracting:(NSDecimalNumber *)decimalNumber withBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior;
    
    - (NSDecimalNumber *)decimalNumberByMultiplyingBy:(NSDecimalNumber *)decimalNumber;
    - (NSDecimalNumber *)decimalNumberByMultiplyingBy:(NSDecimalNumber *)decimalNumber withBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior;
    
    - (NSDecimalNumber *)decimalNumberByDividingBy:(NSDecimalNumber *)decimalNumber;
    - (NSDecimalNumber *)decimalNumberByDividingBy:(NSDecimalNumber *)decimalNumber withBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior;
    

    NSDecimalNumberBehaviors对象可以通过下述方法创建

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

      scale代表保留小数点后几位

      枚举,

        NSRoundPlain,   // Round up on a tie //貌似取整 
        NSRoundDown,    // Always down == truncate  //只舍不入
        NSRoundUp,      // Always up    // 只入不舍
        NSRoundBankers  // on a tie round so last digit is even  貌似四舍五入
    

      

     

  • 相关阅读:
    java中浮点数的比较(double, float)(转)
    SVN与TortoiseSVN实战:补丁详解(转)
    常见名词解析
    SSL连接建立过程分析(1)
    Flash-使用变形面板制作花朵
    使用ReactiveCocoa实现iOS平台响应式编程
    【LaTeX排版】LaTeX论文排版&lt;三&gt;
    angularjs入门学习【指令篇】
    理解class.forName()
    malloc()与calloc差别
  • 原文地址:https://www.cnblogs.com/FranZhou/p/5018728.html
Copyright © 2011-2022 走看看