0

您如何比较从 Cpp 端发送到 QML 函数的浮点数和双精度数?

如果我想像下面提到的那样进行高精度比较here

bool AreSame(double a, double b) {
  return fabs(a - b) < EPSILON;
}

我应该如何在 Qt QML 中做到这一点?

或者,它是否在 QML 中被转换为真实的并且不需要担心它?

4

2 回答 2

3

你应该像在JavaScript中那样做:

x = 0.2 + 0.1;
y = 0.3;
equal = Math.abs(x - y) < Number.EPSILON;

请注意,此 value 属性自 Qt 5.8 起可用。在以前的 Qt 版本中,您可以定义自己的 epsilon,例如:

readonly property double epsilon: Math.pow(2, -52)
于 2017-07-24T13:19:38.740 回答
1

文档中real

注意:在 QML 中,所有实数都以双精度 IEEE 浮点格式存储。

来自关于数据类型转换的文档

+----------------+----------------+
|    Qt Type     | QML Basic Type |
+----------------+----------------+
|  [...]         |  [...]         |
|  double        |  double        |
|  [...]         |  [...]         |
|  float, qreal  |  real          |
+----------------+----------------+

因此,根据文档,并非所有内容都必须转换为real,但所有内容都将具有相同的精度,因此我认为您可以随意转换或比较它们。

您可以创建一个JavaScript 库 来实现该函数,正如您的问题中所述。
或者您可以创建一个 C++ 对象,并公开一个 this 函数,这样您就可以直接在 C++ 中实现。然后你可以决定,是在每个文件中实例化这个对象,在你需要它的地方,还是创建一个单例实例作为库。AFAIK QML 在静态函数方面存在问题,需要对象的实例。

我不知道 QML 中有任何预定义变量指定epsilon. 在 C++ 中,对我来说是:

std::numeric_limits<double>::epsilon() -> 2.220446049250313e-16

所以这附近的东西可能是一个不错的选择。

于 2017-07-24T09:30:06.120 回答