c/c++ 浅谈 float/double 浮点数怎么精确保留几位小数?

时间:2024-04-15 15:08:20

关于c/c++ 中 float 怎么转 int 大家都不陌生

那么一个 float/double 怎么精确保留几位小数怎么做到呢?

比如 3.1415926 ,转为 3.14 或者 3.1400000 ?

网上说的办法 类似如下 根本都无法做到想要的结果

在这里插入图片描述

在这里插入图片描述
当然了 通过stream 转为 string 的方式可行, 但是 你把string 转为float 一样还是会出现精度误差, 无法控制准确
在这里插入图片描述
即便std::string 是3.14 转为 float 也是 3.14000010
在这里插入图片描述
roundf 也是一样的结果
在这里插入图片描述
当时尝试了各种办法 无法解决这个问题
boost::multiprecision 库的有个办法可以 但是是内置类型转为原生float 一样是有误差
如果把 BigDecimal 转为float 还是有误差 这里就不说了
在这里插入图片描述

所以我了解了一下原理

得出结论 c/c++ 无法对浮点数精确表示所有实数!

在 C++ 中,浮点数类型(如 float 和 double)使用二进制浮点数表示法来存储和表示实数。这种表示法无法精确地表示所有的实数,尤其是十进制分数。

浮点数使用有限的比特数来表示小数部分,因此在进行浮点数计算时,可能会发生舍入误差这意味着浮点数在进行运算或转换时可能会产生微小的误差

例如,将 0.1 这个十进制分数表示为二进制浮点数时,会产生无限循环的二进制表示。然而,由于浮点数的存储精度是有限的,因此只能近似地表示这个分数。当您对这个近似值进行操作时,可能会出现舍入误差。

需要注意的是,对于打印输出的目的,可以使用格式化输出来控制浮点数的显示精度,但这并不改变浮点数本身的精度。