(在Xcode 11.1中使用Swift 5.1),如何防止以下失败的测试场景?基本上,我希望能够在Double
上写一个扩展名,这是一个计算属性potentiallyLostPrecision
,可以在通过测试用例Double
的“好” testPrecision17Decimals
和“失败的测试案例Double
中的错误” testPrecision18Decimals
。
我尝试查看ulp,有效位数,将nextUp
与自身进行比较,并查看mantissa
,exponent
等,但是我无法提出任何可行的方法。
import Foundation
import XCTest
class DecimalPrecisionTests: XCTestCase {
func testPrecision13Decimals() {
doTestSmallDecimals(
smallest: 0.0102030405054,
aDecimal: 0.0102030405055,
greatest: 0.0102030405056
)
}
func testPrecision16Decimals() {
doTestSmallDecimals(
smallest: 0.0102030405060705,
aDecimal: 0.0102030405060706,
greatest: 0.0102030405060707
)
}
func testPrecision17Decimals() {
doTestSmallDecimals(
smallest: 0.01020304050607065,
aDecimal: 0.01020304050607066,
greatest: 0.01020304050607067
)
}
// This test fails
func testPrecision18Decimals() {
doTestSmallDecimals(
smallest: 0.010203040506070805,
aDecimal: 0.010203040506070806,
greatest: 0.010203040506070807
)
}
}
private extension DecimalPrecisionTests {
func doTestSmallDecimals(
smallest: Double,
aDecimal: Double,
greatest: Double
) {
XCTAssertGreaterThan(greatest, aDecimal)
XCTAssertGreaterThan(aDecimal, smallest)
XCTAssertLessThan(smallest, aDecimal)
XCTAssertLessThan(aDecimal, greatest)
}
}