C语言中四舍五入问题总结
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
需要注意的是,
在运行代码
printf("1.6: %#x\n",1.6);时,得到的结果并不是1 ,而是0x9999999a,说明格式printf("1.6: %#x\n",1.6);不能正确引用输出。在运行代码
printf("3.0+2: %d\n",3.0+2);时,得到的结果并不是5 ,而是0。这是为什么呢?
C语言中四舍五入问题总结的更多相关文章
- 【Go】四舍五入在go语言中为何如此困难
四舍五入是一个非常常见的功能,在流行语言标准库中往往存在 Round 的功能,它最少支持常用的 Round half up 算法. 而在 Go 语言中这似乎成为了难题,在 stackoverflow ...
- C语言中内存分配那些事儿
C程序的内存结构 C语言的之所以复杂,首先它的内存模型功不可没.不像某些那样的高级语言只需要在使用对象的时候,用new创建.所有之后的事情,你不需要操心.对于C语言,所有与内存相关的东西,都需要熟悉, ...
- C语言中最常用的三种输入输出函数scanf()、printf()、getchar()和putchar()
本文给大家介绍C语言中最常用的三种输入输出函数scanf().printf().getchar()和putchar(). 一.scanf()函数格式化输入函数scanf()的功能是从键盘上输入数据,该 ...
- C语言中强制数据类型转换(转)
原文地址不详 字符型变量的值实质上是一个8位的整数值,因此取值范围一般是-128-127,char型变量也可以加修饰符unsigned,则unsigned char 型变量的取值范围是0-255(有些 ...
- C语言中强制类型转换总结
C语言中强制类型转换总结 ● 字符型变量的值实质上是一个8位的整数值,因此取值范围一般是-128-127,char型变量也可以加修饰符unsigned,则unsigned char 型变量的取值范围 ...
- JAVA语言中的修饰符
JAVA语言中的修饰符 -----------------------------------------------01--------------------------------------- ...
- Java语言中的面向对象特性总结
Java语言中的面向对象特性 (总结得不错) [课前思考] 1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类? 2. 面向对象编程的特性有哪三个?它们各自又有哪些特性? 3. 你知 ...
- python语言中的编码问题
在编程的过程当中,常常会遇到莫名其妙的乱码问题.很多人选择出了问题直接在网上找答案,把别人的例子照搬过来,这是快速解决问题的一个好办法.然而,作为一个严谨求实的开发者,如果不从源头上彻底理解乱码产生的 ...
- 在C语言中利用PCRE实现正则表达式
1. PCRE简介 2. 正则表达式定义 3. PCRE正则表达式的定义 4. PCRE的函数简介 5. 使用PCRE在C语言中实现正则表达式的解析 6. PCRE函数在C语言中的使用小例子 1. P ...
- C语言中函数声明实现的位置
在学习C语言的时候我遇到了这么个事情,因为之前先学习的C#,在C#编译器中,函数的声明位置不会影响编译的结果,但是在C语言中却发生了错误 先看一段代码: #include <stdio.h> ...
随机推荐
- 掌握 Spring IoC 容器与 Bean 作用域:详解 singleton 与 prototype 的使用与配置
在您的应用程序中,由 Spring IoC 容器管理的形成其核心的对象被称为 "bean".一个 bean 是由 Spring IoC 容器实例化.组装和管理的对象 这些 bean ...
- oracle database recover database (下篇)
1. recover database 恢复级别一共三个:recover database > recover tablespace > recover datafile ,最高级别 da ...
- JackSon反序列化通杀
前言 Springboot一般都会自带JackSon这个依赖包,JackSon跟Fastjson有相同的功效 简单复现 package com.example.jakeson.demo; import ...
- Spring-Cloud 组件之 Spring Cloud Eureka:服务注册与发现
Spring Cloud Eureka:服务注册与发现 SpringCloud学习教程 SpringCloud Spring Cloud Eureka是Spring Cloud Netflix 子项目 ...
- json文件读取并转换成为字典python
# JSON到字典转化 f2 = open('info.json', 'r') info_data = json.load(f2) print(info_data) # 显示数据类型 print(ty ...
- iframe跨域,获取iframe中元素
1.需求让iframe嵌入页面,并且没有滚动条,也就是相当于两个页面拼接在一起 跨域解决,通过框架配置代理 proxy: { '/medical': { target: 'https://exampl ...
- LORS:腾讯提出低秩残差结构,瘦身模型不掉点 | CVPR 2024
深度学习模型通常堆叠大量结构和功能相同的结构,虽然有效,但会导致参数数量大幅增加,给实际应用带来了挑战.为了缓解这个问题,LORS(低秩残差结构)允许堆叠模块共享大部分参数,每个模块仅需要少量的唯一参 ...
- 力扣557(java)-反转字符串中的单词(简单)
题目: 给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序. 示例 1: 输入:s = "Let's take LeetCode contest&qu ...
- EMQX + PolarDB-X 一站式 IoT 数据解决方案
简介: 本文整理自 EMQX 产品经理李国伟,在PolarDB开源社区中关于EMQX与PolarDB-X构建一站式IoT数据解决方案的分享.本篇内容主要分为四个部分:1. IoT数据特性 2. EMQ ...
- EventBridge消息路由|高效构建消息路由能力
简介:企业数字化转型过程中,天然会遇到消息路由,异地多活,协议适配,消息备份等场景.本篇主要通过 EventBridge 消息路由的应用场景和应用实验介绍,帮助大家了解如何通过 EventBridg ...