iOS - 在不转换为字符串的情况下从浮点数中删除尾随零?

iOS - remove trailing zeros from float WITHOUT converting to String?

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

虽然这在大多数情况下可能很好,但我正在执行 XCTest,我需要浮点数中的值 - 将生成的字符串转换回浮点数不会给出正确的结果。

输入:

arg0 = 0.0001;
arg1 = 0.0011;

我想要 0.0012 的结果,但是加法 arg0 + arg1 给出了 0.01200 的答案,这反过来又为 XCTest Case 生成了一个失败的测试。

我的加法是最简单的:

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

    return first + second;
}

还有测试用例:

- (void)testAddition3 {

    arg0 = 0.0001;
    arg1 = 0.0011;

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

    XCTAssertEqual(result, 0.0012, @"Addition incorrect!");
}

关于如何做到这一点有什么想法吗?

更改断言以使用 XCTAssertEqualWithAccuracy 而不是 XCTAssertEqual

XCTAssertEqualWithAccuracy. Generates a failure when the difference between expression1 and expression2 is greater than accuracy. This test is for scalars such as floats and doubles, where small differences could make these items not exactly equal, but works for all scalars.

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

比较两个浮点数的典型方法是在某个误差范围内进行比较(通常称为 epsilon)。 你想要的函数是XCTAssertEqualWithAccuracy,它将比较两个具有给定精度的浮点数