c++ - 如何设置浮点数的精度?
问题描述
对于数字 a = 1.263839,我们可以做 -
float a = 1.263839
cout << fixed << setprecision(2) << a <<endl;
输出: - 1.26
但是,如果我想设置一个数字的精度并存储它,例如 - 将 1.263839 转换为 1.26 而不打印它,该怎么办。
解决方案
但是如果我想设置一个数字的精度并存储它怎么办
您可以将所需的精度存储在变量中:
int precision = 2;
然后,您可以稍后在将浮点数转换为字符串时使用此存储的精度:
std::cout << std::setprecision(precision) << a;
我认为 OP 希望在不打印数字的情况下从 1.263839 转换为 1.26。
如果这是您的目标,那么您首先必须意识到,1.26 不能用最常用的浮点表示法表示。最接近的 32 位二进制 IEEE-754 值是 1.2599999904632568359375。
因此,假设这样的表示,您可以期望的最好值是非常接近 1.26 的某个值。在最好的情况下,我展示了一个,但由于我们需要计算该值,请记住,除了无法精确表示该值之外,还可能涉及一些微小的错误(至少在理论上;您的示例输入使用没有错误下面的算法,但应始终使用浮点数学考虑精度损失的可能性)。
计算如下:
- 让 P 赌您想要四舍五入的小数点后的位数(在这种情况下为 2)。
- 令 D 为 10 P(在本例中为 100)。
- 将输入乘以
D
std::round
到最接近的整数。- 除以
D
。
PS 有时您可能不想四舍五入到最接近的值,而是想要精确到std::floor
或。std::ceil
这有点棘手。简直std::floor(val * D) / D
是错误的。例如,9.70 下限为小数点后两位将变为 9.69,这是不可取的。
在这种情况下,您可以做的是乘以一个精度量级,四舍五入到最接近的值,然后除以额外的量级并继续:
- 让 P 赌您想要四舍五入的小数点后的位数(在这种情况下为 2)。
- 令 D 为 10 P(在本例中为 100)。
- 将输入乘以
D
* 10 std::round
到最接近的整数。- 除以 10
std::floor
或者std::ceil
- 除以
D
。
推荐阅读
- javascript - 绑定 this - 调用删除项
- javascript - 如何使用公钥和私钥加密条形码上的数据
- python-3.x - Selenium WebDriver 截图不捕获网页页脚
- angular - 插值不适用于点击方法
- image - 如何通过 http post 上传 QPixmap 图像?
- vb.net - VB.net Crystal 报表导出为 html 并使用 Outlook 作为 html 邮件正文发送
- sql - 如何根据月份参数值将数据从一年的开始月份拉到给定月份
- swift - 如何将 AttributedString 转换为 NSMutableString Swift?
- java - 当 jar 位于 zip 文件中时,如何过滤 jar 中的特定文件夹?
- javascript - 我可以将 jQuery UI 分类在文档上吗?