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是理想的
潜在的选择(作为新手,没有更好或可行的线索)
如果不需要,请不要将
十进制
转换为浮点,因为这将导致精度损失。如果您想比较两个十进制
值的精确度,可以使用十进制距离(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
,我的答案在该上下文中是有效的。我使用这种方法编写了许多测试用例,没有问题,因为我正在设置特定的条件。