相关疑难解决方法(0)

如何在swift中舍入NSDecimalNumber?

我找不到任何资源,我一直在尝试各种各样的东西,但没有任何作用.

根据Apple的文档,你可以像这样围绕NSDecimalNumber:

NSDecimalNumber.decimalNumberByRoundingAccordingToBehavior(<#behavior: NSDecimalNumberBehaviors?#>)
Run Code Online (Sandbox Code Playgroud)

它接受一个NSDecimalNumberBehavior,我不确定如何操作,因为它(1)不能启动到变量并且它的属性已更改,并且(2)根据文档的roundingMode()方法不接受任何参数,但Xcode填写"自我"的参数空间.

我完全迷失了.回到基本问题; 如何在swift中舍入NSDecimalNumber?

提前致谢

xcode nsdecimalnumber swift

11
推荐指数
2
解决办法
5317
查看次数

为 NumberFormatter 生成DecimalNumbers 不起作用

我的功能是将字符串转换为十进制

func getDecimalFromString(_ strValue: String) -> NSDecimalNumber {
    let formatter = NumberFormatter()
    formatter.maximumFractionDigits = 1
    formatter.generatesDecimalNumbers = true
    return formatter.number(from: strValue) as? NSDecimalNumber ?? 0
}
Run Code Online (Sandbox Code Playgroud)

但它没有按预期工作。有时它会像

Optional(8.300000000000001)
Optional(8.199999999999999)
Run Code Online (Sandbox Code Playgroud)

而不是 8.3 或 8.2。在字符串中,我有像“8.3”或“8.2”这样的值,但转换后的十进制不符合我的要求。我犯错的任何建议?

numbers decimal swift

5
推荐指数
1
解决办法
731
查看次数

Swift:正确解码不精确的十进制

我需要Decodable正确解码(协议)一个不精确的十进制值,从这个问题我了解如何正确处理十进制实例化,但是在解码时如何做到这一点?

如果尝试将任何数字初始化为字符串

if let value = try! container.decode(String.self, forKey: .d) {
    self.taxAmount = Decimal(string: value)
}
Run Code Online (Sandbox Code Playgroud)

我明白了Fatal Error: "Expected to decode String but found a number instead."

如果尝试将 130.43 初始化为十进制

if let value = try! container.decode(Decimal.self, forKey: .d) {
    //value.description is 130.43000000000002048
    self.d = Decimal(string: value.description)
    //making subtotal to be also 130.43000000000002048 and not 130.43
}
Run Code Online (Sandbox Code Playgroud)

解码时有什么方法可以使用这个构造函数吗?

  • NSDecimalNumber(string: "1.66")
  • NSDecimalNumber(value: 166).dividing(by: 100)
  • Decimal(166)/Decimal(100)
  • Decimal(sign: .plus, exponent: -2, significand: 166)

以下是我从外部服务收到的 JSON 的简化版本:

{
   "priceAfterTax": 150.00, …
Run Code Online (Sandbox Code Playgroud)

nsdecimalnumber swift decodable

5
推荐指数
1
解决办法
5915
查看次数

NSDecimalNumber和货币-Swift

我读了很多书,这NSDecimalNumber是使用货币时最好的格式。

但是,我仍然遇到浮点问题。

例如。

let a: NSDecimalNumber = 0.07 //0.07000000000000003
let b: NSDecimalNumber = 7.dividing(by: 100) //0.06999999999999999
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用Decimal,b就是我期望的:

let b: Decimal = 7 / 100 //0.07
Run Code Online (Sandbox Code Playgroud)

我在我的应用程序中使用核心数据。所以我坚持NSDecimalNumber。除非我想将很多转换NSDecimalNumbersDecimals

有人可以帮我得到0.07吗?

currency nsdecimalnumber ios swift

2
推荐指数
1
解决办法
1029
查看次数

给定数字时,将小数四舍五入到最接近的增量

我想将小数四舍五入到另一个数字的最接近的增量。例如,给定值2.23678301和增量0.0001,我想将其舍入为2.2367。有时增量可能类似于0.00022,在这种情况下,该值将向下舍入为2.23674

我尝试这样做,但有时结果不正确并且测试未通过:

extension Decimal {
    func rounded(byIncrement increment: Self) -> Self {
        var multipleOfValue = self / increment
        var roundedMultipleOfValue = Decimal()
        NSDecimalRound(&roundedMultipleOfValue, &multipleOfValue, 0, .down)
        return roundedMultipleOfValue * increment
    }
}

/// Tests

class DecimalTests: XCTestCase {
    func testRoundedByIncrement() {
        // Given
        let value: Decimal = 2.2367830187654

        // Then
        XCTAssertEqual(value.rounded(byIncrement: 0.00010000), 2.2367)
        XCTAssertEqual(value.rounded(byIncrement: 0.00022), 2.23674)
        XCTAssertEqual(value.rounded(byIncrement: 0.0000001), 2.236783)
        XCTAssertEqual(value.rounded(byIncrement: 0.00000001), 2.23678301) // XCTAssertEqual failed: ("2.23678301") is not equal to …
Run Code Online (Sandbox Code Playgroud)

decimal rounding foundation swift

1
推荐指数
1
解决办法
440
查看次数