QML 中的 Double 现在完全等价于 Real 吗?

Posted

技术标签:

【中文标题】QML 中的 Double 现在完全等价于 Real 吗?【英文标题】:Is Double Now Fully Equivalent to Real in QML? 【发布时间】:2017-02-17 22:01:11 【问题描述】:

重 JS 的声明性用户界面语言 QML 的一个特殊方面是它包含看似多余的十进制数字类型。

本机类型为十进制数声明了两个 basic types,它们的名称与许多其他编程语言中的名称相似:realdouble

当前文档 (v5.8) 中的表格将 double 描述为...

带小数点的数字,以双精度存储。

...对于real...

带小数点的数字

现在有点奇怪。前面的段落可能会让人相信,与大多数语言一样,这些确实是基于浮点精度的不同类型(参见:C/C++ 中的floatdouble)。

但是这个假设被证明是不正确的。 realstates的文档:

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

这种基本类型是由 QML 语言提供的。

好吧,有点奇怪(那么为什么有两种类型),但假设这是完全准确的,大概选择一个(也许是你正在处理的代码库中的标准)并使用它是有意义的.

但据说有一个意想不到的问题,as noted by Kent Hansen on QtDeclarative:

“real”类型被记录为单精度浮点数,但 这是不正确的。一直都是双倍的。

但是,“real”类型的信号参数将映射到 C++ 输入“qreal”,它可以是浮点数或双精度数,具体取决于 平台。

由于 javascript 浮点数具有双精度,QML 应该使用相同的,以避免潜在的精度损失。

这让我怀疑 Qt 文档中的陈述是否完全准确。 Hansen 的帖子是 4 年前的,当时 Qt/QML v5.1-2 是最新版本。现在我们在v5.6-8,所以我想知道他报告的内容是否仍然是一个问题。

谁能回答最新的Qt/QML 发布版本(v5.6-8,截至 2017 年 2 月)中是否仍然存在这种或任何其他不一致?

这就是为什么包含两种不同的十进制数基本类型的原因,尽管文档似乎表明它们是相同的?

还有其他理由在QML 中使用doublefloat 或反之亦然吗?

【问题讨论】:

【参考方案1】:

这是因为保持向后兼容性的传统。

在 Qt4 中它是一个浮点数。在 Qt5 中 realdouble 的旧代码可以运行,但 QML 引擎的实现不需要再为浮点数操心了。

【讨论】:

那么signalc++ 代码中被转换为float 的问题解决了吗?请注意,作者指出问题在Qt5。你可以添加一个链接到适当的错误跟踪器,确认吗?如果是这样,我可以将此答案标记为正确。 我仍然认为,如果您使用 -float 标志编译 Qt - 那么它将是浮动的。看起来不是问题/错误,而是一些嵌入式平台的快速性能破解。 太好了,我很感激最终的确认/澄清...我正在处理的大部分代码库都使用real,所以我很高兴听到这意味着我可以移动挥之不去的double 实例,无后顾之忧!感谢您的安心!

以上是关于QML 中的 Double 现在完全等价于 Real 吗?的主要内容,如果未能解决你的问题,请参考以下文章

QML 中的 QMessageBox::aboutQt 等价物是啥?

如何完全禁用 Qt Creator 中的 QML 调试器?

对自己的 QML 类使用 float 或 double

Oracle 正则表达式中的 ?= 等价于啥

QML 可以替代 Qt 中的 OpenGL 吗?

等价类分析法