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

时间:2015-02-19 09:04:21

标签: ios formatting floating-point-precision xctest

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

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

输入:

arg0 = 0.0001;
arg1 = 0.0011;

我想要0.0012的结果,但添加arg0 + arg1会给出0.01200的答案,而-(float)addNumber:(float)first toNumber:(float)second { return first + second; } 会为XCTest Case生成失败的测试。

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

- (void)testAddition3 {

    arg0 = 0.0001;
    arg1 = 0.0011;

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

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

以及测试案例:

{{1}}

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

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

将断言更改为使用 XCTAssertEqualWithAccuracy 而不是 XCTAssertEqual

  

XCTAssertEqualWithAccuracy。当expression1和expression2之间的差异大于准确度时,会生成失败。此测试适用于浮标和双打等标量,其中较小的差异可能使这些项目不完全相同,但适用于所有标量。