iOS - 从float中删除尾随零而不转换为String?

Fen*_*son 3 formatting ios floating-point-precision xctest

我想从浮点数中删除尾随零.我找到了多个帖子,但所有答案建议将float转换为NSString并使用NSFormatter.

虽然在大多数情况下这可能是好的,但我正在执行XCTests并且我需要float中的值 - 将生成的String转换回float不会给出正确的结果.

输入:

arg0 = 0.0001;
arg1 = 0.0011;
Run Code Online (Sandbox Code Playgroud)

我想得到一个结果0.0012,但是加法arg0 + arg1给出了答案,0.01200而这又为XCTest Case产生了一个失败的测试.

我添加数字的方法是最简单的:

-(float)addNumber:(float)first toNumber:(float)second {

    return first + second;
}
Run Code Online (Sandbox Code Playgroud)

还有测试用例:

- (void)testAddition3 {

    arg0 = 0.0001;
    arg1 = 0.0011;

    result = [vc addNumber:arg0 toNumber:arg1];

    XCTAssertEqual(result, 0.0012, @"Addition incorrect!");
}
Run Code Online (Sandbox Code Playgroud)

关于如何做到这一点的任何想法?

Ove*_*lex 5

实际问题是浮点数学不精确 - 有些数字不能用二进制精确表示,并且由于微小的舍入误差等等,你无法确定结果.对于一个(人为的)例子,1.0 + 1.0 = 1.99999 ..这使得像平等这样的事情变得困难.

比较两个浮点数的典型方法是在一些错误(通常称为epsilon)内进行比较.你想要的功能XCTAssertEqualWithAccuracy,它将比较具有给定精度的两个浮点数