本文使用C++语言书写,对于C的小伙伴们,如果编译不通过的话……就说明C里面没有这个内容,可以跳过

通常来说,我们书写程序主要只用整形变量

(signed/unsigned) (long/long long/short) int a;

但是有时候,我们又需要一些小数运算。

所以就会出现

float b;
double c;
long double d;

至于具体使用方法……自行度娘。这里需要注意一下浮点数是有精度的

计算机中的数据是用二进制存储的。

十进制小数怎么转换为二进制小数呢?

举个栗子

\[(0.5)_{10} = (0.1)_2 \\
(0.25)_{10} = {0.01}_2
\]

我们是怎么知道的呢?

推理一下,

\[(0.5)_{10} \times (2)_{10} = (1)_{10}
(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\)转换回十进制就是(好难算啊)

\[(0.110011001100)_2 = (1 \times 2^{-1} + 1 \times 2^{-2} + 0 \times 2^{-3} + 0 \times 2^{-4} + \dots)_{10} = (0.79980468750000000000)_{10}
\]

这个误差就是这样产生的。但是一般输出的时候由于误差太小,都会给你四舍五入。

这就是为什么很多题都是叫你保留三位小数,因为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++中浮点数输出精度的问题的更多相关文章

  1. jmeter 中 浮点数计算精度问题

    jmeter 中 浮点数计算精度问题解决方法: 编写 beanshell 时使用 java.math.BigDecimal 方法构造,使用 BigDecimal 并且一定要用 String 来够造. ...

  2. 【转】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 ...

  3. Java中浮点数的精度问题 【转】

    当您在计算Money的时候,请看好了!!!要不损失了别后悔!!! 现象1: public static void main(String[] args) { System.out.println(0. ...

  4. 计算价格, java中浮点数精度丢失的解决方案

    计算价格, java中浮点数精度丢失的解决方案

  5. Java 中的浮点数取精度方法

    Java 中的浮点数取精度方法 一.内容 一般在Java代码中取一个double类型的浮点数的精度,四舍五入或者直接舍去等的方式,使用了4种方法,推荐使用第一种,我已经封装成工具类了. 二.代码实现 ...

  6. 当向计算机中存入一个float类型的数值2.2 后,在从计算机中读出输出,这时2.2 的值已经发生了变化(转)

    problom : 'f1' value hava been changed when output. reason : the binary repersentation of 2.2f is : ...

  7. java中浮点数的比较(double, float)(转)

    问题的提出:如果我们编译运行下面这个程序会看到什么? public static void main(String args[]){ System.out.println(0.05+0.01); Sy ...

  8. Python的浮点数损失精度问题

    本篇讨论的现象可以从下面这段脚本体现出来: >>> x = 0.0 >>> for i in range(10): x += 0.1 print(x) 0.1 0. ...

  9. C/C++中浮点数输出格式问题

    在C语言中,浮点数的输出格式有三种:%g, %f, %e 首先要说的是%e是采用科学计数法来显示. %g与后两者有一个重要的差别,就是设置输出精度的时候,(C中默认浮点输出精度是6),%g认为,包括整 ...

随机推荐

  1. axios与vue-resource

    在Vue项目中前后端交互时,早期Vue使用Vue-resource实现异步请求.从Vue2.0之后就不再对vue-resource进行更新,Vue官方推荐使用axios. vue-resource V ...

  2. JS预编译过程

    GO和AO 变量的预编译 实例1 console.log(a); var a=1; console.log(a); 实际编译过程: 将a存入预编译对象中,赋值为undefined: 真正的赋值语句当程 ...

  3. 每日学习——C++习题

    1.题目要求:求圆的面积,数据成员为半径r,定义为私有成员,要求用成员函数实现在键盘上输入圆半径,计算圆面积.输出圆面积三个功能,要求三个成员函数在类内声明,在类外定义 //定义类 class Cir ...

  4. express 路由匹配和数据获取

    express配置路由只需要通过app.method(url,func)来配置,其中url配置和其中的参数获取方法不同 直接写全路径 路由中允许存在. get请求传入的参数 router.get(&q ...

  5. Kotlin协程入门

    开发环境 IntelliJ IDEA 2021.2.2 (Community Edition) Kotlin: 212-1.5.10-release-IJ5284.40 介绍Kotlin中的协程.用一 ...

  6. jmeter 录制排除模式

    jmeter录制时,静态的资源不需要,可以在录制的时候直接排除. .*\.(bmp|css|js|gif|icov|jpeg|png|swf|woff|woff2|htm|html).* .*\.(j ...

  7. 『GoLang』字典Map

    map是一种元素对的无序集合,一组称为元素value,另一组为唯一键索引key. 未初始化map的值为nil.map 是引用类型,可以使用如下声明: var map1 map[keytype]valu ...

  8. JS获取contextPath的方法

    function getContextPath() { var pathName = document.location.pathname;    var index = pathName.subst ...

  9. 10.3 Nginx

    Nginx介绍 engine X,2002年开发,分为社区版和商业版(nginx plus) 2019年 f5 Networks 6.7亿美元收购nginx Nginx 免费 开源 高性能 http ...

  10. 关于VS中的无法解析的外部符号问题

    利用caffe的源码编译出的caffe.lib静态链接库里面就包含了源码里面的那些函数的接口i,所以如果在程序中使用的是源码的话,就不需要在链接器里面再添加此静态链接库了 对于无法解析的外部符号,首先 ...