Qt的进位规则导致5不进位

废话少数,附上测试代码:

    double value = 12.1785;
	QString str = QLocale::system().toString(value, 'f', 3);
	double value1 = 7.2785;
	QString str1 = QLocale::system().toString(value1, 'f', 3);
	QString str2 = QString::number(value, 'f', 3);
	QString str3 = QString::number(value1, 'f', 3);

如果在不清楚Qt的进位规则时,你可能以为只是简单的四舍五入;
下面给出运行结果:

Qt的进位规则导致5不进位_第1张图片

是不是很意外,其实Qt采用的是四舍五入五成双的进位规则。

我们再看看value和value1的值:

Qt的进位规则导致5不进位_第2张图片

这里我们的目的是取小数点后三位,根据四舍五入五成双的进位规则,此时被修约的数字等于5,5前面为偶数,
    1.对于value,被修约的数字后面的没有大于0的数,所以不进位;
    2.对于value1,被修约的数字后面存在大于0的数,所以不论前面的数是否为偶数,均进位。
    这就导致了进位不符合我们常有的四舍五入规则了,那么,问题来了,若我们需要采用四舍五入的规则来保留有效小数,那么就应该另寻途径了,下面提供一种简单的方法:

Qt的进位规则导致5不进位_第3张图片

即:

	double d1 = floor((value * pow(10, 3) + 0.5)) / pow(10, 3);
	double d2 = floor((value1 * pow(10, 3) + 0.5)) / pow(10, 3);
	QString str4 = QString::number(d1);
	QString str5 = QString::number(d2);

这里的灵活性在于加上0.5后向下取整。

你可能感兴趣的:(Qt)