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

3
我希望将浮点数中的尾部零去除。 我找到了多篇文章,但所有答案都建议将浮点数转换为NSString并使用NSFormatter。 虽然在大多数情况下这可能是好的,但我正在执行XCTests并且我需要浮点数的值 - 将生成的字符串转换回浮点数不会给出正确的结果。 对于输入:
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!");
}

有没有关于如何实现这个的想法?

你的代码现在是什么样子的?从黑盒子的角度来看,很难弄清楚为什么会得到这个结果。 另外,除非你要在某个地方显示这个数字(必须是字符串),否则这些“尾随零”会成为问题吗? - Timothy Groote
编辑了我的帖子,请看一下。 - Fengson
2个回答

5
实际问题在于浮点数计算不精确 - 一些数字无法在二进制中精确表示,由于微小的舍入误差等原因,你无法确定结果。举个(假造的)例子,1.0 + 1.0 = 1.99999.. 这使得像相等性这样的问题变得困难。
比较两个浮点数的典型方式是在某个误差范围内进行比较(通常称为epsilon)。你需要的函数是XCTAssertEqualWithAccuracy,它将使用给定的精度比较两个浮点数。

是的,这解决了问题,谢谢你的答案和有趣的解释 :) - Fengson
1
没问题。你可能还想查看这个链接上关于“XCTAssertEqualWithAccuracy不起作用”的SO帖子。 - Paradise

3

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

XCTAssertEqualWithAccuracy。当表达式1和表达式2之间的差异大于精度时,生成失败。此测试适用于标量,如浮点数和双精度浮点数,其中小的差异可能使这些项不完全相等,但适用于所有标量。


我在你回答前几分钟就解决了它,但还是谢谢你,它解决了我的问题! :) - Fengson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接