请考虑以下代码:
0.1 + 0.2 == 0.3 -> false
Run Code Online (Sandbox Code Playgroud)
0.1 + 0.2 -> 0.30000000000000004
Run Code Online (Sandbox Code Playgroud)
为什么会出现这些不准确之处?
我知道因UIKit使用CGFloat分辨率独立坐标系而使用.
但我想,以检查是否例如每次frame.origin.x是0它让我感到恶心:
if (theView.frame.origin.x == 0) {
// do important operation
}
Run Code Online (Sandbox Code Playgroud)
是不是CGFloat有比较时容易误报==,<=,>=,<,>?这是一个浮点,他们有不寻常的问题:0.0000000000041例如.
Objective-C在比较时是在内部处理这个,还是可能发生origin.x读取为零的情况并不是0真实的?
今天,我正在查看一些C++代码(由其他人编写)并找到了这一部分:
double someValue = ...
if (someValue < std::numeric_limits<double>::epsilon() &&
someValue > -std::numeric_limits<double>::epsilon()) {
someValue = 0.0;
}
Run Code Online (Sandbox Code Playgroud)
我试图弄清楚这是否有意义.
文档epsilon()说:
该函数返回1和大于1的最小值之间的差值,可以表示[乘双].
这是否也适用于0,即epsilon()最大值是否大于0?或者有没有之间的数字0,并0 + epsilon可以由代表double?
如果没有,那么比较不等于someValue == 0.0?
我很好奇是否有一种方法可以通过现代 api 快速实现最接近的值?
例如:
let x = [1.2, 3.4, 4.5, 6.7, 8.9]
print(x.getClosestValue(3.7) //3.4
Run Code Online (Sandbox Code Playgroud)
我一直在尝试使用map和reduce,但仍然无法解决这个问题。出现的问题是我必须迭代整个数组才能检测误报。在某些情况下,您可以拥有多个最接近的值,所以只是想知道如何快速完成此操作?