Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 在XCTAssertEqual中使用基础十进制类型_Swift_Xctest_Foundation - Fatal编程技术网

Swift 在XCTAssertEqual中使用基础十进制类型

Swift 在XCTAssertEqual中使用基础十进制类型,swift,xctest,foundation,Swift,Xctest,Foundation,我正在构建一些类和代码来存储和执行货币值的算术运算。我最初使用的是双精度,但由于算术错误而转换为十进制 我试图找到对使用十进制类型的函数运行单元测试的最佳方法 考虑位置。totalCost是十进制类型 xctasertequal(position.totalCost,3571.6,精度:0.01) 此代码不编译,因为十进制不符合浮点。XCTASERTEQUAL要求参数为双精度或浮点型 我通过以下方法解决了这个问题: xctasertrue(position.totalCost==3571.6)

我正在构建一些类和代码来存储和执行货币值的算术运算。我最初使用的是双精度,但由于算术错误而转换为十进制

我试图找到对使用十进制类型的函数运行单元测试的最佳方法

考虑
位置。totalCost
是十进制类型

xctasertequal(position.totalCost,3571.6,精度:0.01)

此代码不编译,因为十进制不符合浮点。XCTASERTEQUAL要求参数为双精度或浮点型

我通过以下方法解决了这个问题:

xctasertrue(position.totalCost==3571.6)

这确实有效,但如果在单元测试期间出现错误,我会得到一个模糊的消息:

xctasertrue失败
而不是更有用的
xctasertequal失败:(“2.0”)不等于(“1.0”)

因此,使用XCTAssertEqual是理想的

潜在的选择(作为新手,没有更好或可行的线索)

  • 对my Position类进行编码以将所有属性存储为十进制,但使用计算属性获取并将其设置为双精度

  • 编写一个接受小数的自定义断言。这可能是最“正确”的路径,因为到目前为止,我在使用小数时遇到的唯一问题是XCT断言不能接受它们

  • 编写一个将返回双精度值的愚蠢的十进制扩展名。无论出于何种原因,Decimal类中没有返回Double或Floag的属性或函数


  • 如果不需要,请不要将
    十进制
    转换为浮点,因为这将导致精度损失。如果您想比较两个
    十进制
    值的精确度,可以使用
    十进制距离(to:)
    函数,如下所示:

    let other = Decimal(35716) / Decimal(10) // 3571.6
    let absoluteDistance = abs(position.totalCost.distance(to: other))
    let accuracy = Decimal(1) / Decimal(100) // 0.01
    XCTAssertTrue(absoluteDistance < accuracy)
    
    let other=Decimal(35716)/Decimal(10)//3571.6
    设绝对距离=绝对值(位置.总成本.距离(至:其他))
    设精度=小数(1)/小数(100)//0.01
    xctasertrue(绝对距离<精度)
    
    您真的需要指定
    0.01
    精度吗

    因为如果省略这个参数,它的编译就很好了

    struct Position {
        let totalCost: Decimal
    }
    
    let position = Position(totalCost: 3571.6)
    
    //passes
    XCTAssertEqual(position.totalCost, 3571.6)  
    
    // XCTAssertEqual failed: ("3571.6") is not equal to ("3571.61")
    XCTAssertEqual(position.totalCost, 3571.61)  
    

    演示如何将十进制转换为双精度。但请注意,这可能会失去精度,因此自定义断言可能是更好的解决方案:“不要直接调用此初始值设定项。”另一个问题(比较):
    print(Decimal(floatLiteral:1.66))/1.6599999999959504
    您可以减去小数:
    abs(totalCost-other)
    (totalCost-other).magnity
    的可读性可能更好。但由于舍入和表示错误,通常无法使用通过计算得出的小数之间的相等。谢谢,如果省略精度参数,它确实有效。然而,正如@matt所述,代码并不适用于所有值。不要使用3571.6,试试0.12345。在你的问题中,你说这是可行的:
    xctasertrue(position.totalCost==3571.6)
    @matt足够正确,但这个问题是关于在特定单元测试用例的上下文中使用
    xctasertequal
    ,我的答案在该上下文中是有效的。我使用这种方法编写了许多测试用例,没有问题,因为我正在设置特定的条件。