当浮点数小于1时,函数返回0
Function returns 0 when float number is under 1
我有这个代码来计算二叉树主要分支之间的差异,重要的是最后一个。调试我得到最后一个表达式:
return difRama/total;
这将始终以百分比形式返回0到1之间的小数。我遇到这样的情况:
- 返回5/15
返回4/10
float Arbol::diferenciaRamas(pnodo rama1, pnodo rama2){ int total, difRama, pesoIzq, pesoDer; /* Calculamos pesos rama izq yder*/ pesoIzq = pesoRamificaciones(rama1); pesoDer = pesoRamificaciones(rama2); /* Diferencia de peso entre ramas */ difRama = abs(pesoIzq - pesoDer); /* Total de peso del arbol */ total = (pesoIzq+pesoDer); /* Si el total es 0 o la diferencia es 0 */ if(total == 0 || difRama == 0) return 0; /* Porcentaje de diferencia */ return difRama / total; }
问题是函数总是返回0,知道吗?
除法发生在从int
到float
的隐式转换之前。
在除法之前,您需要从int
到float
的显式强制转换。
return (float) difRama / total;
您应该知道,根据运算符优先级规则,上面的强制转换适用于除法之前的difRama
(而不是除法的结果)。
您正在用整数算术计算除法。如果除法中的两个参数都是整型,则会发生这种情况,而与结果所分配的变量类型无关。
一个简单的解决方案是将商预乘以1.0f
:
返回1.0f * difRama / total;
这将强制将自变量提升为float
s。
相反(我更喜欢),乘以1.0
,这将迫使参数提升为double
,并且当返回时,整个表达式将经历隐式的缩小转换为float
。
这是因为变量difRama和total都是int类型。如果结果有小数部分(第一种情况为0.33,第二种情况为0.4),它将被截断。但是,如果显式地将其中一个转换为float,则不会发生截断。像这样:
return static_cast<float>(difRama) / total;
相关文章:
- 从函数返回const char*数组
- 检查函数返回类型是否与STL容器类型值相同
- 从 c 或 cpp 系列子函数返回到主函数
- 从函数返回任意简单类型的数据
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 从 C++ 中的函数返回数组地址问题
- VirtDisk.h QueryChangesVirtualDisk() 函数返回 RangeCount 为 0
- 为什么glGetSubroutineIndex为不同的函数返回相同的值?
- 在 c++ 中将函数返回类型指定为模板参数
- 从封装在对象中的函数 C++ 返回时为空的列表
- 为什么向量内部的指针在从函数返回时会发生变化?
- 函数返回的 rvalue 引用(表达式)是 xvalue - 但没有标识?
- 程序中的布尔函数返回输入的范围无论如何都是无效的
- 寿命延长从函数返回引用
- 程序不向函数返回值
- 字符串函数返回奇怪的值
- 类的大问题,以及从空函数c++返回
- 为什么在尝试测量函数返回所需的时间时,我的运行时编号是错误的?
- C++二叉搜索树模板从函数返回节点
- NVCC 错误:string_view.h:constexpr 函数返回是非常量