添加Float并没有给出Qt的精确结果

时间:2014-06-25 11:15:15

标签: c++ qt

我正在申请中添加价格。我的值为QString s,我转换为float和add。当它达到高值时,结果不准确。我读取像float或double不应该用于货币添加并使用单独的变量用于整数部分和小数部分。我的代码和日志如下:

qDebug ("m_totalPrice: %f + %f =", m_totalPrice, item.price.toFloat());
m_totalPrice += item.price.toFloat();
qDebug ("m_totalPrice: %f", m_totalPrice);
ui->totalLabel->setText(QString::number(m_totalPrice, 'f', 2));  

m_totalPricefloatitem.priceQString

日志:

  
      
  1. m_totalPrice:424659.500000 + 22350.500000 =
    m_totalPrice:447010.000000
  2.   
  3. m_totalPrice:447010.000000 + 18.900000 =
    m_totalPrice:447028.906250
  4.   
  5. m_totalPrice:447028.906250 + 125.900002 =
    m_totalPrice:447154.812500
  6.   
  7. m_totalPrice:447154.812500 + 125.900002 =
    m_totalPrice:447280.718750
  8.   
  9. m_totalPrice:447280.718750 + 11.500000 =
    m_totalPrice:447292.218750
  10.   
  11. m_totalPrice:447292.218750 + 22.500000 =
    m_totalPrice:447314.718750
  12.   

错误来自第2行。有人可以告诉你如何解决这个问题吗?

编辑:因为我的问题还没有完成 在第2行,它显示添加了447010.000000 + 18.900000 = 447028.906250
我怀疑是在添加之后它至少应该是447028.9000 ..

1 个答案:

答案 0 :(得分:2)

这里有几个因素要考虑。

  1. Float只有大约6位精度,而且很容易超过。您可以使用double来解决这个问题,它可以提供大约15位数字。
  2. 存储为浮点数的小数分数是近似值。当你添加它们时,错误会累积,当你减去时,你会失去精度。您可以通过将所有货币值存储为美分(而非美元)或甚至百分之一美分并根据需要转换/格式化来解决此问题。
  3. 如果你这样做,那么每当你乘法或除法时,你必须四舍五入到最接近的整数(分或其他),以避免累积错误。
  4. 我在这里推荐的简单解决方案是使用双精度作为扩展精度整数,它可以找到最多15位数或几万亿美元,以美分表示。

    但是,如果您对货币计算非常认真,则需要查找并使用固定十进制算术包。这笔投资是值得的。

    我同意:永远不要使用浮动!