Qt 返回糟糕的数学运算
qt returns bad math
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
中。 只要你在整数之间进行数学运算,结果就会保留为整数。 12
是int
,1000000
是int
,3800
是int
。 当你将它们相乘时,结果仍然是int
,即使它不再合适。 添加 LL
后缀以使整数文本长整型。即 12LL
、1000000LL
、3800LL
等...
您可以通过对操作重新排序来解决此问题:
12 * 1000000 * 3800 / 200000
将溢出int
,但是:
12 * 1000000 / 200000 * 3800
不会。
请注意,只有当分子是分母的整数倍时,这才会给出相同的答案。在支持它的平台上使用 LL
是一个更好的解决方案,但如果限制为 4 字节int
类型,这至少可以在更多情况下阻止溢出。
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何获取std::result_of函数的返回类型
- 使用C++中的模板和运算符重载执行矩阵运算
- QueryWorkingSet总是返回false
- (C++)分析树以计算返回错误值的简单算术表达式
- 访问者访问变体并返回不同类型时出错
- 如何返回一个类的两个对象相加的结果
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- lower_bound()返回最后一个元素
- 在代码中返回3221225725以进行简单概率运算
- 对返回0数组的数组执行位"或"或"异或"运算
- 如何正确返回矩阵乘法运算的结果
- 2 uint32_t之间的数学运算返回uint64_t
- SSE内部函数导致正常浮点运算返回-1.#INV
- Qt 返回糟糕的数学运算
- 返回类型取决于算术运算的顺序.对吗?