Qt 返回糟糕的数学运算

qt returns bad math

本文关键字:运算 返回 Qt      更新时间:2023-10-16

mlAnswer = ( ( ( degreesPLato->text().toInt() * 1000000 ) * 3800 ) / answer );

是查询中的代码 mlAnswer输出 -8223,而我的计算器输出 228000

调试输出

12 * 1000000 * 3800 / 200000 = -8223

所有数据类型都是ints请告诉我我做错了什么。

12 * 1000000 * 3800 = 456 亿。

这超出了 4 字节有符号整数的范围,而 int 通常是这样。 请尝试改用long long

整数文字的默认类型是 int ,除非该数字太大而无法容纳在int中。 只要你在整数之间进行数学运算,结果就会保留为整数。 12int1000000int3800int。 当你将它们相乘时,结果仍然是int,即使它不再合适。 添加 LL 后缀以使整数文本长整型。即 12LL1000000LL3800LL等...

您可以通过对操作重新排序来解决此问题:

12 * 1000000 * 3800 / 200000

将溢出int,但是:

12 * 1000000 / 200000 * 3800

不会。

请注意,只有当分子是分母的整数倍时,这才会给出相同的答案。在支持它的平台上使用 LL 是一个更好的解决方案,但如果限制为 4 字节int类型,这至少可以在更多情况下阻止溢出。