我使用固定的小数点(使用uint16_t)来存储2位小数的百分比。我发现将双精度值转换为整数的方式会对结果值产生影响。

const char* testString = "99.85";
double percent = atof(testString);
double hundred = 100;
uint16_t reInt1 = (uint16_t)(hundred * percent);
double stagedDouble = hundred * percent;
uint16_t reInt2 = (uint16_t)stagedDouble;

示例输出:
percent:      99.850000
stagedDouble: 9985.000000
reInt1:       9984
reInt2:       9985

在0到10000之间的所有值(固定点表示法)中,大约47%的值中可以看到该错误。当使用stagedDouble进行铸造时,它根本不会出现。我不明白为什么这两个整数是不同的。我使用的是GCC6.3.0。
编辑:
改进了代码片段以演示percent变量并统一两个语句之间的系数。将100更改为double似乎是质量更改,可能会影响输出,但它不会更改程序中的任何内容。

最佳答案

是浮子吗?如果是的话,看看你在增加什么类型。
percentreInt1并且double * floatstagedDouble。混合浮点数学会导致这些类型的舍入错误。
将100改为两者都int * float或两者都double会得到相同的答案。

关于c - 为什么将double转换为int可能会得出不同的结果?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56173220/

10-11 20:55