【问题标题】:How to split a NSDecimalnumber between decimal & integer & back如何在十进制和整数之间拆分 NSDecimalnumber 并返回
【发布时间】:2009-01-28 16:38:57
【问题描述】:

我不知道如何从 NSDecimalnumber 中获取整数和十进制值。

例如,如果我有 10,5,如何得到 10 和 5?

如果我有 10 和 5,如何返回 10,5?


嗯,好的,看起来更好!

但是,我担心丢失小数。

这是针对国际化应用的。例如,如果用户设置价格“124,2356”,我想加载并保存确切的数字。


嗯,好吧,就是这样,但不尊重小数位数。如果存在一种从我设置的当前本地知道的方法。

这是因为它代表货币价值...

【问题讨论】:

    标签: objective-c cocoa math nsdecimalnumber


    【解决方案1】:

    我使用 2 作为比例尺,因为您说这是用于货币的,但您可以选择使用另一个四舍五入比例尺。我也忽略了舍入可能带来的任何异常,因为这是一个非常简单的示例。

    NSDecimalNumberHandler *behavior = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundDown scale:0 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:NO];
    NSDecimalNumber *price = /* eg. 10.5 */;
    NSDecimalNumber *dollars = [price decimalNumberByRoundingAccordingToBehavior: behavior];
    NSDecimalNumber *cents = [price decimalNumberBySubtracting: dollars];
    

    这将分别在 dollarscents 变量中为您提供 10 和 0.5。如果您想要整数,可以使用此方法将您的 cents 乘以 10 的幂。

    cents = [cents decimalNumberByMultiplyingByPowerOf10: 2];
    

    这反过来将cents 乘以 100,在 dollarscents 中得到 10 和 5。您还应该知道,您可以在这里使用 10 的负幂进行除法。

    所以,

    cents = [cents decimalNumberByMultiplyingByPowerOf10: -2];
    

    将撤消最后一个方法。

    【讨论】:

    • 规模不应该是0吗?使用 2 的比例,10.5 的价格将舍入 10.5 美元。从价格中减去它会得到 0 美分
    • 我相信当数字为负数时这不起作用,因为RoundDown 从零开始舍入然后根据 developer.apple.com/reference/foundation/…>。并且基于负值在向上或向下舍入模式之间切换很简单,除非测试负值并不简单,最容易做到num.doubleValue >= 0。至少 Swift 中的 Decimal 公开了一个 sign 属性。
    【解决方案2】:

    不确定目标 c 有什么数学函数,但类似于

    Math.floor(10.5) = 10
    (10.5 - 10) * 10 = 5
    

    一个更清晰的例子(10 的 cos)

    Math.floor(20.4) = 20
    (20.4 - 20) * 10 = 4;
    

    另一个问题

    (5 / 10) = .5
    10 + .5 = 10.5
    

    小数点上使用的 10 取决于小数位数...例如

    Math.floor(20.44) = 20
    (20.44 - 20) * 100 = 44;
    

    要求你乘以 100

    【讨论】:

      【解决方案3】:

      如果您无权访问数学 fns,这可能有效:

      double val = [dn doubleValue]; // dn is a NSDecimalNumber*
      int intPart = (int) val;
      double doublePart = (val - intPart); 
      

      这可能会给你带来一些麻烦,循环可能永远不会终止,在这种情况下你将不得不在那里放置一个计数器:

      while (doublePart != (int)doublePart) doublePart*=10;
      

      【讨论】:

        【解决方案4】:

        double floor (double x); 是一个 POSIX 函数。该函数可用于查找不大于x的最大整数值。

        double x = 10.5;
        
        double y = floor (x);
        // y = 10.0
        
        double z = x - y;
        // z = 0.5
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-05-28
          • 2010-09-09
          • 2018-01-16
          • 2016-02-24
          • 2010-10-25
          • 1970-01-01
          • 1970-01-01
          • 2021-12-17
          相关资源
          最近更新 更多