可能丢失精度¶
ID: cs/loss-of-precision
Kind: problem
Security severity:
Severity: error
Precision: high
Tags:
- reliability
- correctness
- external/cwe/cwe-190
- external/cwe/cwe-192
- external/cwe/cwe-197
- external/cwe/cwe-681
Query suites:
- csharp-security-and-quality.qls
将两个整数表达式相除或相乘的结果转换为浮点值可能会导致精度损失。 对于整数除法,结果中的任何小数部分都将丢失。 对于整数乘法,结果可能超出整数范围并溢出。
建议¶
对于除法,除非您打算将结果向下舍入为整数,否则应在执行除法之前将其中一个操作数强制转换为浮点类型。 对于乘法,除非您打算溢出,否则应在执行乘法之前将其中一个操作数强制转换为浮点类型。
示例¶
在本例中,c
等于 5,因为执行了整数除法。
void DivisionLossOfPrecision()
{
int a = 21;
int b = 4;
float c = a / b;
}
将其中一个整数强制转换为浮点数可确保使用浮点除法并保留余数,从而使 c
的值为 5.25。
void DivisionNoLossOfPrecision()
{
int a = 21;
int b = 4;
float c = (float)a / b;
}
在本例中,如果 a
大于 536,870,911,则结果将溢出。
void MultiplicationLossOfPrecision(int a)
{
int b = 4;
float c = a * b;
}
将其中一个整数强制转换为浮点数可确保使用浮点乘法并避免溢出。
void MultiplicationNoLossOfPrecision(int a)
{
int b = 4;
float c = (float)a * b;
}