我想从浮点数中删除尾随零。 我找到了多个帖子,但所有答案建议将浮点数转换为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}}
关于如何做到这一点的任何想法?
答案 0 :(得分:5)
实际问题是浮点数学不精确 - 有些数字不能用二进制精确表示,并且由于微小的舍入误差等等,你无法确定结果。对于一个(人为的)例子,1.0 + 1.0 = 1.99999 ..这使得像平等这样的事情变得困难。
比较两个浮点数的典型方法是在一些错误(通常称为epsilon)内进行比较。
你想要的函数是XCTAssertEqualWithAccuracy
,它将比较具有给定精度的两个浮点数
答案 1 :(得分:3)
将断言更改为使用 XCTAssertEqualWithAccuracy 而不是 XCTAssertEqual 。
XCTAssertEqualWithAccuracy。当expression1和expression2之间的差异大于准确度时,会生成失败。此测试适用于浮标和双打等标量,其中较小的差异可能使这些项目不完全相同,但适用于所有标量。