双数据类型解释错误

Interpretation error of double data type

本文关键字:错误 解释 数据类型      更新时间:2023-10-16

我使用键盘上的std::cin读取double值,设该值为1.15。当我在读取值后放置断点时,visual studio显示该值为1.14999999。但是如果我把它打印出来,它会在我的控制台上显示1.15。后来我写了下面的代码,它没有工作好

int main()
{
    long double valueA;
    int required;
    std::cin>>valueA;
    required=(valueA*10000)-(((int)valueA)*10000);
    std::cout<<(required);
}

当输入为1.015时,输出为149,但期望输出为150。为什么我的编译器认为1.015为1.014999999?我怎样才能纠正这个错误呢?

您所描述的是浮点错误。这是因为浮点数在硬件级别的表示方式(见这里)。基本上,一个浮点数被保存为sme,并被重构为s * m * 2 ^ e,其中^是s的幂,如果s位为0,则s为1,如果s位为1,则为-1。

如果你需要这种精度,你可以使用十进制算术库,这或多或少是一样的,但不是使用2的幂,而是使用10的幂,因为它们是在软件中实现的,这意味着它们可以有任意的精度(更多关于这里)。

下面是一个可以使用的实现十进制运算的库列表:

  • gmp - https://gmplib.org/
  • qdecimal - https://code.google.com/p/qdecimal/
  • intel decimal- https://software.intel.com/en-us/articles/intel-decimal-floating-point-math-library/