C/C++中浮点数输出精度的问题
本文使用C++语言书写,对于C的小伙伴们,如果编译不通过的话……就说明C里面没有这个内容,可以跳过
通常来说,我们书写程序主要只用整形变量
(signed/unsigned) (long/long long/short) int a;
但是有时候,我们又需要一些小数运算。
所以就会出现
float b;
double c;
long double d;
至于具体使用方法……自行度娘。这里需要注意一下浮点数是有精度的
计算机中的数据是用二进制存储的。
十进制小数怎么转换为二进制小数呢?
举个栗子
(0.25)_{10} = {0.01}_2
\]
我们是怎么知道的呢?
推理一下,
(0.5)_{10} = (1)_{10} \div (2)_{10} = (1)_2 \div (10)_2 = (0.1)_2
\]
然后再根据以下度娘的方法,对于十进制小数,每次乘以2,然后取整数位(0/1),就可以得到二进制下的小数
比如

但是我们也要知道,并不是所有小数乘以2的有限次幂就能得到整数的
比如\((0.8)_{10}\),如果小伙伴们自行转换一下,就会发现\((0.8)_{10} = (0.110011001100\dots)_2\)
是不是无限循环?
但是计算机也不能无限表示啊
他就只能截断到某一位,这就会产生精度误差
比如,\((0.8)_{10}\)在计算机中存储的是\((0.110011001100)_2\),当然实际上他存储的位数更多,所以误差更小
那么\((0.110011001100)_2\)转换回十进制就是(好难算啊)
\]
这个误差就是这样产生的。但是一般输出的时候由于误差太小,都会给你四舍五入。
这就是为什么很多题都是叫你保留三位小数,因为float三位之后就会有误差,对于不同的方法输出的结果不同。
那么对于浮点数的输出格式,也很简单啦
我们可以
printf("%.3f", x);
这里.3其实就是0.3, 表示。。。表示
也可以
cout << fixed << setprecision(3);
cout << x << endl;
这里fixed是强制小数输出,否则的话……你可能会看到3.42344856131e-31这样的结果,其实他是精度误差下的0
setprecision(int)就是设置从此以后cout输出的数据都带有int位小数位,不足补0
C/C++中浮点数输出精度的问题的更多相关文章
- jmeter 中 浮点数计算精度问题
jmeter 中 浮点数计算精度问题解决方法: 编写 beanshell 时使用 java.math.BigDecimal 方法构造,使用 BigDecimal 并且一定要用 String 来够造. ...
- 【转】QT中QDataStream中浮点数输出问题
先上代码: C/C++ code ? 1 2 3 4 5 6 7 8 9 10 11 12 13 int main(int argc, char *argv[]) { QApplicati ...
- Java中浮点数的精度问题 【转】
当您在计算Money的时候,请看好了!!!要不损失了别后悔!!! 现象1: public static void main(String[] args) { System.out.println(0. ...
- 计算价格, java中浮点数精度丢失的解决方案
计算价格, java中浮点数精度丢失的解决方案
- Java 中的浮点数取精度方法
Java 中的浮点数取精度方法 一.内容 一般在Java代码中取一个double类型的浮点数的精度,四舍五入或者直接舍去等的方式,使用了4种方法,推荐使用第一种,我已经封装成工具类了. 二.代码实现 ...
- 当向计算机中存入一个float类型的数值2.2 后,在从计算机中读出输出,这时2.2 的值已经发生了变化(转)
problom : 'f1' value hava been changed when output. reason : the binary repersentation of 2.2f is : ...
- java中浮点数的比较(double, float)(转)
问题的提出:如果我们编译运行下面这个程序会看到什么? public static void main(String args[]){ System.out.println(0.05+0.01); Sy ...
- Python的浮点数损失精度问题
本篇讨论的现象可以从下面这段脚本体现出来: >>> x = 0.0 >>> for i in range(10): x += 0.1 print(x) 0.1 0. ...
- C/C++中浮点数输出格式问题
在C语言中,浮点数的输出格式有三种:%g, %f, %e 首先要说的是%e是采用科学计数法来显示. %g与后两者有一个重要的差别,就是设置输出精度的时候,(C中默认浮点输出精度是6),%g认为,包括整 ...
随机推荐
- (xxl_job | quartz):XXL_JOB 对比 Quartz 一决高下!
概述: XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速.学习简单.轻量级.易扩展. 现已开放源代码并接入多家公司线上产品线,开箱即用. 官方地址中文版:http://www.x ...
- python库--flashtext--大规模数据清洗利器
flashtext.keyword (flashtext) 类/方法 返回值 参数 说明 .KeywordProcessor() 对象kp case_sensitive=False 是否区分大小写 添 ...
- Emit优化反射(属性的设置与获取)
在频繁的通过反射来设置和获取属性的值时是比较耗时的,本章通过Emit技术优化反射来提高获取和设置属性值的效率 一.实现代码: /// <summary> /// 设置器委托 /// < ...
- Java中使用jxl.jar将数据导出为excel文件
Java对Excel文件的读写操作可由jxl.jar或poi.jar实现,这里使用jxl.jar完成对Excel文件的导出. 一.将Excel文件导出在本地 步骤: 创建文件 -> 创建 ...
- Ubuntu中类似QQ截图的截图工具并实现鼠标右键菜单截图
@ 目录 简介: 安装: 设置快捷键: 实现鼠标右键菜单截图: 简介: 在Windows中用惯了强大易用的QQ截图,会不习惯Ubuntu中的截图工具. 软件名为火焰截图,功能类似QQ截图,可以设置快捷 ...
- windows 下使用 mingw编译器 调试时 无法跟进源码
windows 下使用 mingw编译器 调试时 无法跟进源码 最近在公司使用QT 开发,官方在线下载的 安装的QT mingw 都是没有debug版本的 由于没有debug版本动态库 所以你调试的时 ...
- Java面向对象系列(2)- 回顾方法的定义
方法的定义 修饰符 返回类型 break:跳出switch,结束循环和return的区别 方法名:注意规范,见名知意 参数列表:(参数类型,参数名) 异常抛出 package oop.demo01; ...
- docker挂载目录问题:touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied
docker 运行后, 执行docker logs -f myjenkins时报错:touch: cannot touch '/var/jenkins_home/copy_reference_file ...
- 我在学习Blazor当中踩的巨坑!Blazor WebAssembly调试
最近嘛,看看Blazor已经蛮成熟的.顺便想在自家的框架里使用这个东西,毕竟我还是很念旧的,而且Blazor的技术栈也不麻烦.然后呢,在调试这一关我可是踩了大坑. 我的VS是2019,很早以前装的.然 ...
- CSS 奇技淫巧 | 妙用混合模式实现文字镂空波浪效果
本文将介绍一个小技巧,通过混合模式 mix-blend-mode 巧妙的实现文字的镂空波浪效果. 起因 一日,一群友私聊问我.如何使用 CSS 实现下述效果,一个文字的波浪效果: 我当时想都没想,就回 ...