在 NSDecimalNumber 的索引处查找数字

Posted

技术标签:

【中文标题】在 NSDecimalNumber 的索引处查找数字【英文标题】:Find digit at index of NSDecimalNumber 【发布时间】:2017-12-02 18:56:10 【问题描述】:

是否可以在 NSDecimalNumber 的索引处找到数字?

例如,这样的事情可能吗?

var a: NSDecimalNumber = 10.00123456789
var indexOfa = a(index: 6)
//indexOfa = 6 (6th position from the left)

我基本上是在尝试制作一个自定义舍入函数,在 x.xx5 上舍入并在 x.xx6 上舍入。

例如: 67.5558 四舍五入为 67.55。 67.5568 舍入为 67.56。

...不是舍入问题的副本。我在这里专门询问如何在 NSDecimalNumber 的指定索引处查找数字。

您链接的答案也没有回答我的问题。我可以使用 NSDecimalNumber 的舍入行为,但它会在 0.5 上四舍五入,我需要它在 0.5 和 0.6 上四舍五入。如果我能找到第二个十进制数的索引,我可以创建自己的自定义舍入函数。

我有一个可行的解决方案。但它太可怕了。里面有一些 NSDecimalNumber 扩展,但你可能猜到它们在做什么。而且我敢肯定还有更好的方法...

public func currencyRoundDown() -> NSDecimalNumber 
    let rounded: NSDecimalNumber
    let toThree = self.roundDown(3)
    let lower = self.roundDown(2).adding(0.005)
    if lower.moreThan(toThree) || lower.same(toThree) 
        rounded = toThree.roundDown(2)
     else 
        rounded = toThree.roundUp(2)
    
    return rounded

【问题讨论】:

你可以研究一下,请看这个问题-> ***.com/questions/41744278/… @LateNate 不要重复您自己的问题。如果您提出问题的方式有问题,请编辑 我不同意它不能回答你的问题。如果您考虑***.com/questions/27338573/… 的答案,您会发现答案 is 在那里。关键是你的问题没有增加任何东西。你可以通过搜索(和思考)来解决这个问题。 嘿@matt。在我提出问题之前,我检查了那个答案。我知道我可以使用确实可以将 1.25 舍入到 1.2 的银行家舍入方法。但它不会将 423.66552 舍入到 423.66。它四舍五入到 434.67。我试图在 0.005 和 0.006 的小数点后第二位向下舍入。任何舍入行为都不允许这样做。我有一个可行的解决方案,但它很荒谬。我将 423.66552 向下舍入到小数点后 2 位,然后与原始值进行比较,如果它的高舍入和低舍入。必须有更简单的方法。 我用我可怕的解决方案编辑了问题,这会让我做噩梦。有用。但它太可怕了。一些 NSDecimal 扩展,但你明白了。 【参考方案1】:

是否可以在 NSDecimalNumber 的索引处找到数字?

让我们考虑如何使用 Double 来实现。在此渲染中,“索引”从小数点开始计数。

将索引乘以 10,将索引数字带入 1 的位置。现在取余数模 10。这是有问题的数字。

    let d = 1234.56789 // the 5 is 1, the 6 is 2, the 7 is 3 ...
    let place = 3 
    let shift = pow(10.0, Double(place)) * d
    let digit = Int(shift) % 10 // 7

【讨论】:

以上是关于在 NSDecimalNumber 的索引处查找数字的主要内容,如果未能解决你的问题,请参考以下文章

NSDecimalNumber integerValue 在 iOS8 中表现异常

iOS - 数值精度处理之NSDecimalNumber

在字符串中的 Y 索引处查找 X 字符并使用此信息过滤数组

如何在 NSDecimalNumber 中存储 1.66

舍入 NSDecimalNumber

在数字中的特定数字处查找数字[关闭]