Qt QML中疯狂字符串数字比较的解决方法

时间:2016-11-01 10:05:27

标签: javascript qt qml

这是Qt(LTS 5.6.2)QML JavaScript实现中的数字比较的疯狂字符串:

console.log("240000000000" == "3776798720");
console.log("240000000000" === "3776798720");
console.log("240000000000" === "3776798721");

输出是:

true
true
false

它看起来像字符串解释为(u)int32和高字节丢失:

240000000000 == 0x37E11D6000
3776798720   ==   0xE11D6000

此错误也会对对象产生影响:

var g = {};
var h = "240000000000";
g[h] = h + "BUG";
console.log(JSON.stringify(g, null, 2));
console.log(g["3776798720"], g["240000000000"]);

输出:

qml: {
    "3776798720": "240000000000BUG"
}
qml: 240000000000BUG 240000000000BUG

如您所见,钥匙已损坏。该值可以通过两个不同的字符串获得。

问题

有没有选项可以在不修补Qt的情况下解决这个问题?或者至少在Qt中可能出现问题的大致位置可以改善自己?

P.S。此处还有我的同事报告的QTBUG-56830

2 个答案:

答案 0 :(得分:4)

我看不到解决方法,所以我做了一个修复:向qtdeclarative申请我在这里发布的补丁

https://codereview.qt-project.org/#/c/175782

重新编译它。

答案 1 :(得分:1)

这里似乎有效的解决方法

console.log(String("3776798720").localeCompare("240000000000") === 0)
console.log(String("3776798721").localeCompare("240000000000") === 0)
console.log(String("240000000000").localeCompare("240000000000") === 0)

输出:

qml: false
qml: false
qml: true

或者如果你有字符串变量

var str = "3776798720"
console.log(str.localeCompare("240000000000") === 0)