首页 > 其他分享 >C语言中四舍五入问题总结

C语言中四舍五入问题总结

时间:2024-04-29 21:45:27浏览次数:20  
标签:总结 四舍五入 1.6 转换 int 类型转换 C语言 3.0 printf

C语言中四舍五入问题的总结

在C语言中大部分情况下都是不需要四舍五入的。

除了一种情况:在使用输出函数 printf()限制浮点型输出的小数位个数

eg:

printf("%0.2f",1.567);//输出的结果是1.57

其他情况下都不需要四舍五入,比如

  • 强制转换

在不同类型的混合运算中,编译器也会自动地转换数据类型,将参与运算的所有数据先转换为同一种类型,然后再进行计算。

转换的规则:转换按数据长度增加的方向进行,以保证数值不失真,或者精度不降低。

eg:

  1. int 和 long 参与运算时,先把 int 类型的数据转成 long 类型后再进行运算。
  2. 所有的浮点运算都是以双精度进行的,即使运算中只有 float 类型,也要先转换为 double 类型,才能进行运算。
  3. char 和 short 参与运算时,必须先转换成 int 类型。
  • 自动转换

自动类型转换是编译器默默地、隐式地进行的一种类型转换,不需要在代码中体现出来;强制类型转换是程序员明确提出的、需要通过特定格式的代码来指明的一种类型转换。换句话说,自动类型转换不需要程序员干预,强制类型转换必须有程序员干预。

强制转换格式: (需要转换的数据类型) 变量

总结:无论是自动类型转换还是强制类型转换,都只是为了本次运算而进行的*临时性转换*,转换的结果也会保存到临时的内存空间(栈空间),不会改变数据本来的类型或者值。

debug程序如下:

#include<stdio.h>

int main(int argc, char const *argv[])
{
    int a=((double)(3/2)+0.5+(int)1.987);
    //(double)(3/2)先计算3/2,再强转,(int)1.987=1
    int b=1.9+2.3;
    //先计算 1.9+2.3(其中自动转化成double类型),因为b是int类型,所以b=4
    printf("a=%d\n",a);
    printf("b=%d\n",b); 
    printf("(int)1.6: %d\n",(int)1.6);
    printf("1.6: %#x\n",1.6);
    printf("3.0+2: %f\n",3.0+2);
    printf("3.0+2: %d\n",3.0+2);
    return 0;
}

运行结果 :

PS E:\桌面资料\jing117> cd "e:\桌面资料\jing117" ; if ($?) { gcc debug.c -o debug } ; if ($?) { .\debug }
a=2
b=4
(int)1.6: 1
1.6: 0x9999999a
3.0+2: 5.000000
3.0+2: 0


需要注意的是,

  1. 在运行代码
printf("1.6: %#x\n",1.6);

时,得到的结果并不是1 ,而是0x9999999a,说明这个格式不能正确引用输出。

  1. 在运行代码
printf("3.0+2: %d\n",3.0+2);

时,得到的结果并不是5 ,而是0。这是为什么呢?

标签:总结,四舍五入,1.6,转换,int,类型转换,C语言,3.0,printf
From: https://www.cnblogs.com/JinBool/p/18166697

相关文章

  • 《微机结构》总结
    这段时间我们学习了微机的结构,通过学习我对计算机有了一个理解,首先,微机结构是指微型计算机的硬件组成和工作原理,是计算机科学中的重要领域之一。微机结构的设计和优化直接影响着计算机的性能、功耗和成本。这也是计算机的特点及优势。微机结构的主要组成部分有:央处理器,也叫cpu:cpu......
  • C语言关于头文件的使用
    截图:main.c////Createdbyclouon2024/4/29.//#include<stdio.h>#include"main.h"//包含自己实现的头文件//定义全局变量intcnt;intsum;//定义函数intfunc(intx,chary){return0;}//定义函数intfunc2(intx,inty){returnx+y;}......
  • C语言进制转换与打印
    #include<stdio.h>intmain(){intn1=10;//十进制intn2=0b10;//二进制intn3=017;//八进制intn4=0x1a;//十六进制//以十进制的方式打印printf("%d\n",n1);//10printf("%d\n",n2);//2printf(&q......
  • C语言关于多源文件的调用
    图片A.c////Createdbyclouon2024/4/29.//#include<stdio.h>#include"A.h"voidfunc(){printf("helloworld\n");}A.h////Createdbyclouon2024/4/29.//#ifndefMULTIPLE_SOURCE_FILES_A_H#defineMULTIPLE_SOUR......
  • 关于C语言的常量
    #include<stdio.h>intmain(){//(1)指向整型常量的指针。【constpointer】地址:可变,值:不可变constint*p1;//等价于intconst*p2;printf("[[constantpointer]]beforechangeaddress:%p\n",p1);inta=1;p1=&a;printf(&qu......
  • C语言输入输出
    #include<stdio.h>intmain(){//练习:计算圆的面积,其半径由用户指定floatradius;//圆的半径printf("enterradius:");scanf("%f",&radius);//理解为阻塞式函数constfloatPI=3.14;floatarea=PI*radius*radius;p......
  • 求极限的方法总结
    求极限的方法总结两个重要极限:\(\Large\underset{x\rightarrow0}{\lim}\frac{\sinx}{x}=1\)\(\Large\underset{x\rightarrow\infty}{\lim}(1+\frac{1}{x})^x=e\)1.直接代入函数在某点连续,函数在该点的极限等于该点的函数值一切初等函数在其定义区间内都是连续的,都可......
  • 招投标05-总结
    ##########################################前面我们输出了招标投标法和政府采购法的梳理内,按照规划内容,本节是招投标的最后一节,谈一谈个人对于招标的感谢。招投标内容以总-分-总的形式完成,第一节列出整体流程,后面的二、三是对第一节内容的展开。第四节招投标法是补充需要查看......
  • p1140 C语言循环数
    #include<stdio.h>#include<stdlib.h>#include<math.h>#include<string.h>#defineN100intmain(){intn,x,y,i,j,p,q,t,s;chara[N]={'0'};while(scanf("%s",&a)!=EOF){intb[N];......
  • 05-ES6语法总结
    varlet和const#var以后尽量少用,函数作用域#在ES6之前,我们都是用var来声明变量,而且JS只有函数作用域和全局作用域,没有块级作用域,所以{}限定不了var声明变量的访问范围。#ES6新增了let命令,用来声明局部变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块......