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

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

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

eg:

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

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

  • 自动转换

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

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

eg:

​ ① int 和 long 参与运算时,先把 int 类型的数据转成 long 类型后再进行运算。

​ ② 所有的浮点运算都是以双精度进行的,即使运算中只有 float 类型,也要先转换为 double 类型,才能进行运算。

​ ③ 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,再强转,(double)(3/2)=1.0,(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,说明格式 printf("1.6: %#x\n",1.6); 不能正确引用输出。

  2. 在运行代码 printf("3.0+2: %d\n",3.0+2); 时,得到的结果并不是5 ,而是0。这是为什么呢?

C语言中四舍五入问题总结的更多相关文章

  1. 【Go】四舍五入在go语言中为何如此困难

    四舍五入是一个非常常见的功能,在流行语言标准库中往往存在 Round 的功能,它最少支持常用的 Round half up 算法. 而在 Go 语言中这似乎成为了难题,在 stackoverflow ...

  2. C语言中内存分配那些事儿

    C程序的内存结构 C语言的之所以复杂,首先它的内存模型功不可没.不像某些那样的高级语言只需要在使用对象的时候,用new创建.所有之后的事情,你不需要操心.对于C语言,所有与内存相关的东西,都需要熟悉, ...

  3. C语言中最常用的三种输入输出函数scanf()、printf()、getchar()和putchar()

    本文给大家介绍C语言中最常用的三种输入输出函数scanf().printf().getchar()和putchar(). 一.scanf()函数格式化输入函数scanf()的功能是从键盘上输入数据,该 ...

  4. C语言中强制数据类型转换(转)

    原文地址不详 字符型变量的值实质上是一个8位的整数值,因此取值范围一般是-128-127,char型变量也可以加修饰符unsigned,则unsigned char 型变量的取值范围是0-255(有些 ...

  5. C语言中强制类型转换总结

    C语言中强制类型转换总结  ● 字符型变量的值实质上是一个8位的整数值,因此取值范围一般是-128-127,char型变量也可以加修饰符unsigned,则unsigned char 型变量的取值范围 ...

  6. JAVA语言中的修饰符

    JAVA语言中的修饰符 -----------------------------------------------01--------------------------------------- ...

  7. Java语言中的面向对象特性总结

    Java语言中的面向对象特性 (总结得不错) [课前思考]  1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类?  2. 面向对象编程的特性有哪三个?它们各自又有哪些特性?  3. 你知 ...

  8. python语言中的编码问题

    在编程的过程当中,常常会遇到莫名其妙的乱码问题.很多人选择出了问题直接在网上找答案,把别人的例子照搬过来,这是快速解决问题的一个好办法.然而,作为一个严谨求实的开发者,如果不从源头上彻底理解乱码产生的 ...

  9. 在C语言中利用PCRE实现正则表达式

    1. PCRE简介 2. 正则表达式定义 3. PCRE正则表达式的定义 4. PCRE的函数简介 5. 使用PCRE在C语言中实现正则表达式的解析 6. PCRE函数在C语言中的使用小例子 1. P ...

  10. C语言中函数声明实现的位置

    在学习C语言的时候我遇到了这么个事情,因为之前先学习的C#,在C#编译器中,函数的声明位置不会影响编译的结果,但是在C语言中却发生了错误 先看一段代码: #include <stdio.h> ...

随机推荐

  1. #dp#C 公共子序列

    题目 给定两个字符串\(s1,s2\),求它们的\(LCS\) 满足\(|s1|\leq 10^6,|s2|\leq 10^3\) 分析 考场写了\(O(|s1|*|s2|)\)成功TLE, 考虑突破 ...

  2. 2022 OpenHarmony年度运营报告

  3. C#-GroupBox包含控件,如何获取这些控件的名称

    您可以使用 Enumerable.OfType在GroupBox中查找和投射您的RadioButtons: var radioButtons = groupBox1.Controls.OfType&l ...

  4. C语言 01 概述

    历史 C 语言是一门面向过程的计算机编程语言,于 1972 年诞生于贝尔实验室. C 语言是丹尼斯·里奇(Dennis Ritchie)以 B 语言为基础发展而来,因此他被称为 C 语言之父. C 语 ...

  5. 一文告诉你商业智能BI如何推动推动智慧物流发展

    随着网络消费的不断发展,推动了物流等相关产业的迅速发展,另外无论是2B业务还是2C业务的生产制造企业,对物流的要求都越来越高,尤其体现在对物流全程透明可视化的需求.商业智能BI平台的引入,大大提高了物 ...

  6. Noah-MP陆面过程模型建模

    [原文链接]:Noah-MP陆面过程模型建模方法与站点.区域模拟实践技术 [方式]:直播+永久回放+长期答疑群辅助+全套资料 [目标]:了解陆表过程的主要研究内容以及陆面模型在生态水文研究中的地位和作 ...

  7. HDC 2022精彩继续,多重亮点进来看!

    原文:https://mp.weixin.qq.com/s/YX5vD4cxM8dA4v2ukFooyA,点击链接查看更多技术内容.  

  8. c# 历史版本特性

    版本 .NET Framework版本 Visual Studio版本 发布日期 特性 C# 1.0 .NET Framework 1.0 Visual Studio .NET 2002 2002.1 ...

  9. Pytorch-tensor的转置,运算

    1.矩阵的转置 方法:t() a=torch.randint(1,10,[2,3]) print(a,'\n') print(a.t()) 输出结果 tensor([[2, 8, 2], [9, 2, ...

  10. WAF网站访问限制

    请参考:https://www.cnblogs.com/yangyangblog/p/14930159.html 文件下载的地方可以网络搜索,这里提供IIS7 WINDOWS64位版本:https:/ ...