浮点数和除法精度问题

时间:2019-05-31 19:27:30

标签: c++ c floating-point precision

我在C ++代码中遇到浮点精度问题

给定double d = 32.4;

d / 0.01 == 3240.0;

为真,而

d / 0.1 == 324.0

给出错误的结果。

但是,如果我乘以10和100,那么结果都是正确的。

由于32.4、324和3240都可以用64位double表示,而没有任何精度损失,所以这个结果令我非常困惑。 (我对浮点数的乘法和除法运算不是很熟悉)

在我的用例中,我将通过简单地乘以或除以0.1、0.01、0.05之类的东西在不同的比例之间进行一些转换。我的意思是,我不需要很高的精度,我的操作数通常少于6个小数,可以用64位双精度数表示而不会造成精度损失,所以我想获得一致的结果。我有一个猜测:在我的用例中,我应该始终使用乘法而不是除吗?

1 个答案:

答案 0 :(得分:1)

您似乎对浮点类型可以代表什么值感到误解。

值32.4 不能以任何二进制浮点格式精确表示,也不能以0.1或0.01表示。它看起来像是重复的小数。它与值1/3相同,也不能完全以十进制格式(即0.3333333333333 ....)表示。...因此,使用这些值的任何算术运算都将不准确。

您可以做的最好的事情是将浮点值的除法更改为整数值(例如)的乘法。 / 0.1-> * 10。即使那样,结果也不会准确,因为32.4的原始值无法准确表示。您需要将结果四舍五入为整数值才能得到准确的值。