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

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

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

### Double 类型浮点数的精度范围 Double 类型浮点数基于 IEEE 754 标准中的双精度浮点数表示法,其能够提供大约 **15 到 17 位十进制小数的精度**[^1]。这意味着,在大多数情况下,`double` 类型可以精确存储和表达具有这些范围内有效数字的小数值。 具体而言,IEEE 754 双精度浮点数使用 64 位来表示一个数字,其中: - 1 位用于符号, - 11 位用于指数部分, - 52 位用于尾数(也称为有效数字)。 由于尾数的有效位数决定了 `double` 的精度,因此它可以在科学计算和其他需要高精度的应用场景下表现良好。然而需要注意的是,尽管它可以支持多达 17 位小数的精度,但在实际应用中通常只推荐依赖前 15 位小数以避免舍入误差的影响[^3]。 以下是 C++ 和 Python 中分别展示如何控制输出精度的例子: #### 控制输出精度的代码示例 ##### C++ ```cpp #include <iostream> #include <iomanip> int main() { double num; std::cin >> num; // 输入一个双精度浮点数 std::cout << std::fixed << std::setprecision(15) << num << std::endl; // 输出保留15位小数 return 0; } ``` ##### Python ```python number = float(input("请输入一个双精度浮点数: ")) formatted_number = f"{number:.15f}" # 使用字符串格式化方法指定15位小数 print(formatted_number) ``` 上述两个例子展示了如何通过编程手段设定输出时所期望的小数位数。对于更复杂的环境或者特定需求,则可能还需要考虑其他因素如舍入模式等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值