双数据类型的解释错误

Posted

技术标签:

【中文标题】双数据类型的解释错误【英文标题】:Interpretation error of double data type 【发布时间】:2014-08-08 17:52:03 【问题描述】:

我使用键盘上的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?我该如何纠正这个错误?

【问题讨论】:

【参考方案1】:

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

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

以下是您可以使用的实现十进制算术的库列表:

gmp - https://gmplib.org/ qdecimal - https://code.google.com/p/qdecimal/ 英特尔十进制 - https://software.intel.com/en-us/articles/intel-decimal-floating-point-math-library/

【讨论】:

以上是关于双数据类型的解释错误的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:无法将“4”解释为数据类型

JS中六种数据类型——String (转)

核心数据属性类型列表?

错误:在 c 中转换用户定义的数据类型

python都有哪些数据类型

Access 2013 导入类型转换错误处理空白