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. 掌握 Spring IoC 容器与 Bean 作用域:详解 singleton 与 prototype 的使用与配置

    在您的应用程序中,由 Spring IoC 容器管理的形成其核心的对象被称为 "bean".一个 bean 是由 Spring IoC 容器实例化.组装和管理的对象 这些 bean ...

  2. oracle database recover database (下篇)

    1. recover database 恢复级别一共三个:recover database > recover tablespace > recover datafile ,最高级别 da ...

  3. JackSon反序列化通杀

    前言 Springboot一般都会自带JackSon这个依赖包,JackSon跟Fastjson有相同的功效 简单复现 package com.example.jakeson.demo; import ...

  4. Spring-Cloud 组件之 Spring Cloud Eureka:服务注册与发现

    Spring Cloud Eureka:服务注册与发现 SpringCloud学习教程 SpringCloud Spring Cloud Eureka是Spring Cloud Netflix 子项目 ...

  5. json文件读取并转换成为字典python

    # JSON到字典转化 f2 = open('info.json', 'r') info_data = json.load(f2) print(info_data) # 显示数据类型 print(ty ...

  6. iframe跨域,获取iframe中元素

    1.需求让iframe嵌入页面,并且没有滚动条,也就是相当于两个页面拼接在一起 跨域解决,通过框架配置代理 proxy: { '/medical': { target: 'https://exampl ...

  7. LORS:腾讯提出低秩残差结构,瘦身模型不掉点 | CVPR 2024

    深度学习模型通常堆叠大量结构和功能相同的结构,虽然有效,但会导致参数数量大幅增加,给实际应用带来了挑战.为了缓解这个问题,LORS(低秩残差结构)允许堆叠模块共享大部分参数,每个模块仅需要少量的唯一参 ...

  8. 力扣557(java)-反转字符串中的单词(简单)

    题目: 给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序. 示例 1: 输入:s = "Let's take LeetCode contest&qu ...

  9. EMQX + PolarDB-X 一站式 IoT 数据解决方案

    简介: 本文整理自 EMQX 产品经理李国伟,在PolarDB开源社区中关于EMQX与PolarDB-X构建一站式IoT数据解决方案的分享.本篇内容主要分为四个部分:1. IoT数据特性 2. EMQ ...

  10. EventBridge消息路由|高效构建消息路由能力

    ​简介:企业数字化转型过程中,天然会遇到消息路由,异地多活,协议适配,消息备份等场景.本篇主要通过 EventBridge 消息路由的应用场景和应用实验介绍,帮助大家了解如何通过 EventBridg ...