c++ - 双数据类型的解释错误

标签 c++ visual-c++

我使用 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?我该如何纠正该错误?

最佳答案

您所描述的是浮点错误。发生这种情况是因为浮点在硬件级别的表示方式(参见 here )。基本上, float 保留为 sme,并重建为 s * m * 2 ^ e,其中 ^ 是 的幂,如果 s 位为 0,则 s 为 1;如果 s 位为 1,则为 -1。

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

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

关于c++ - 双数据类型的解释错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25209387/

相关文章:

C++ 转换并写入值为 10 的无符号整数给出 5 个字节

c++ - 在禁用 MSVC 语言扩展的情况下使用 Boost.Thread header

c++ - 二叉搜索树。插入方法插入不正确

c++ - 带有 SFML API 的内部编译器错误 Visual Studio Community 2017

c++ - 将 64 位位集转换为二进制字符串表示形式似乎是特定于编译器的失败

visual-c++ - 在 C++ 中将 4 个字节转换为 DWORD

c++ - 在 C++ 中创建一堆对象

C++ 在测试成员变量是否等于 NULL 时卡住

c++ - Visual C++ 数组文字

c++ - 无法让 argv 传递给字符串