首页 > 其他分享 >【C语言基础】float、double 浮点数类型的四舍五入问题

【C语言基础】float、double 浮点数类型的四舍五入问题

时间:2023-12-04 21:58:28浏览次数:34  
标签:四舍五入 储存 double 浮点数 float 保留 小数

简短不看版:

C语言中,不能进行 double a == double b 这样的运算。

另外,printf(".1f", &double) 的时候,数据输出不同时候,可能会不一样。

根本问题时float类型或者double类型的浮点数在计算机中不能精确储存。

              单精度浮点型(float)存储方式

比如,若我们希望计算机储存的是2.445,但实际上计算机可能储存的是2.44499997844,又或者储存的是2.44500045123。由于无法保证完全精确储存,所以导致了不同情况下第N+1位位5时候保留小数出现的情况不同。

调试办法:printf()的时候使用%.10f,看看他到底储存的是什么,例如如下:

 

 

问题背景:

%.1f 其实是有四舍五入的功能的,如下图所示:

但也有不正常工作的时候,float保留几位小数时是否具有四舍五入的功能?或者有时候自己如何去四舍五入,有时候不想四舍五入?

保留两位小数时,按理来说保留两位小数点都应该是2.45,可是第一个float调试出来就出现了问题,这到底是怎么回事呢?

不管是%.1f还是%.2f,对于float保留小数时,确实是具有四舍五入功能的

但是根本问题是float类型或者double类型的浮点数在计算机中不能精确储存!但是double类型相对来说精确储存能力又强一些。

其中集中表现在要保留N位小数时,恰好第N+1位小数是数字5,此时会出现明显差异,达不到预期效果:

比方说:我们希望计算机储存的是2.445,但实际上计算机可能储存的是2.44499997844,又或者储存的是2.44500045123。由于无法保证完全精确储存,所以导致了不同情况下第N+1位位5时候保留小数出现的情况不同

至此我们也就能够理解了,对于2.44499997844,保留两位小数时,小数点后第三位为4,所以输出2.44,对于2.44500045123,保留两位小数时,小数点后第三位为5,所以输出为2.45!



转载自CSDN博主「荔枝荷包蛋666」:https://blog.csdn.net/qq_73814284/article/details/127334155

扩展文章:float double浮点型深度解刨:https://blog.csdn.net/m0_63125842/article/details/127313071?spm=1001.2014.3001.5501

标签:四舍五入,储存,double,浮点数,float,保留,小数
From: https://www.cnblogs.com/FBsharl/p/17876086.html

相关文章

  • 【C语言】浮点数在内存中的存储
    常⻅的浮点数:3.14159、1E10等,浮点数家族包括:float、double、longdouble类型。 浮点数表⽰的范围:float.h中定义我们先通过一道题目来了解:#include<stdio.h>intmain(){intn=9;float*pFloat=(float*)&n;printf("n的值为:%d\n",n);printf("*pFloat的值为:%f\n",......
  • Add double quotes to surrounding a word/text
    InVIMforVScode,howtoaddapairofdoubleorsinglequotestosurroundanexistingword/text/numebr?I'vebeenwritingRcodeswithVScodeformanyyears(ThankstotheawesomeRpluginforVScode!).Sometimes,I'llcreateasetofcharacte......
  • Java基础——进制,浮点数
    进制二进制:用0,1表示,满2进1。、以0b或者0B开头。八进制用0到7表示,满8进1。以数字0开头。十进制用0到9表示,满10进1十六进制用0到9及A到F表示,此处的A到F不区分大小写,满16进1。以0X或者0x开头。例子如下:inti1=0B10;//二进制0Binti2=010;//八进制0inti3......
  • 【实例】Verilog对数据进行四舍五入(round)与饱和(saturation)截位
    转自https://blog.csdn.net/yan1111112/article/details/118498533重点:1、正数截位:直接看截掉的最高位是不是一,是的话进一。   负数截位:截的最高位为1且其它位不全是0进一2、饱和,也就是大于求的结果,整数变为符号位为0,其它位为1;负数变成第一位为1,其它位为0. 一、引言......
  • verilog实现 floor, round 四舍五入 和 saturation 操作
    floor,round和saturation是进行bit位削减时常用的方法,floor和round用于削减低位,saturation用于削减高位。floor和round的区别在于,floor是将低位直接丢掉,而round则是在丢掉低位前先进行四舍五入。round和saturation的使用范例如下: 假设有一个32bit有符号数a[31:0],其低10bit......
  • C# double decimal 四舍五入
    传送门usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;publicclassProgram{publicstaticvoidMain(){//先看看double类型通过Math.Round取两位小数得到什么Console.WriteLine(Math.Round(2.345d,2));//2.35//再看看de......
  • flotat浮点数类型的误差问题,float a=0.1; 2-a*a*100,和int(2-a*a*100); float的误差问
    来在于洛谷的《深入浅出程序设计竞赛》(基础篇)#include<stdio.h>intmain(){ floata=0.1; printf("%f%f\n",a,a*a); printf("%d\n",int(2-a*a*100)); printf("%.10f",2-a*a*100); return0;}执行结果 原因是这样的,float是浮点数,在执行界面出现的6位小......
  • 【C语言】浮点数取整
    向下取整1. 强制类型转换floatf=1.5;inta;a=(int)f;2.高斯函数doublefloor(doublea)floatf=1.5;inta;a=floor(f);向上取整1.ceil函数doubleceil(doublea)floatf=1.5;inta;a=ceil(f); 2. 强制类型转换+四舍五入floatf=......
  • 浮点数格式: FP64, FP32, FP16, BFLOAT16, TF32
    浮点数格式(参考1,参考2)浮点数是一种用二进制表示的实数,它由三个部分组成:sign(符号位)、exponent(指数位)和fraction(小数位)。不同的浮点数格式有不同的位数分配给这三个部分,从而影响了它们能表示的数值范围和精度。例如: 下面是一些常见的浮点数格式的介绍:FP64(双精度浮点数):用64位......
  • 洛谷B2016 浮点数向零舍入(Python3)
    要点:1.有正有负怎么办?正负分开写?如果只看数字部分,那取整的方式是一样的。所以我们可以先输出符号,把问题全都转化到非负数集中。2.如何取整?此处取整为向下取整。而强制类型转换把浮点数转化为整型数的时候是把小数部分全部去掉,而不是四舍五入,与题中取整方式相符,故可直......