当前位置:首页 » 编程语言 » c语言一个浮点数怎么只输出整数
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言一个浮点数怎么只输出整数

发布时间: 2022-07-07 20:21:30

① 在c语言中,如何将一个浮点数变换成整数

需要准备的材料分别有:电脑、C语言编译器。

1、首先,打开C语言编译器,新建一个初始.cpp文件,例如:test.cpp。

② c语言中如何输入一个浮点数x然后输出x但保留五位小数

  1. 声明变量x为double型(浮点双精度)或float(浮点单精度)。

  2. 调用输入函数scanf("%lf",&x);或scanf("%f",&x);——其中%lf表示x是double型、%f表示float型。

  3. 调用printf("%.5f ",x);输出——其中.5表示小数点后保留5位小数。

③ C语言的浮点型怎么转换为整型

C语言中,浮点型转换为整型可以用:强制类型转换、自动类型转换,例如:(int)3.14、int a = 3.14。

1、强制类型转换

强制类型转换是通过类型转换运算来实现的。其一般形式为:(类型说明符)(表达式),其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。

例如: (double) a 把a转换为双精度浮点型,(int)(x+y) 把x+y的结果转换为整型。

2、自动类型转换

(1)执行算术运算时,低类型(短字节)可以转换为高类型(长字节);例如: int型转换成double型,char型转换成int型等。

(2)赋值表达式中,等号右边表达式的值的类型自动隐式地转换为左边变量的类型,并赋值给它。

(3)函数调用时,将实参的值传递给形参,系统首先会自动隐式地把实参的值的类型转换为形参的类型,然后再赋值给形参。

(4)函数有返回值时,系统首先会自动隐式地将返回表达式的值的类型转换为函数的返回类型,然后再赋值给调用函数返回。

(3)c语言一个浮点数怎么只输出整数扩展阅读:

C语言中常用的数据类型:

1、int:整型

2、float:单精度浮点型

3、double:双精度浮点型

4、char:字符型

5、char *:字符指针型

④ C语言程序设计:输入浮点数12.5分别输出它的整数数部分和小数部分!

这个进行转换就能完成

#include<stdio.h>

intmain()
{
floata,c;
intb;
printf("请输入一个小数:");
scanf("%f",&a);
b=(int)(int)(a+1.0e-6);;
c=a-b;
printf(" 输入的是:%f整数是:%d小数是:%f ",a,b,c);
}

⑤ 请教C语言浮点数输出问题。

调试了一下发现这个,8.85705,和9.85705的精度都会丢失,所以要想得到你要的数据建议使用%.5f


为何浮点数可能丢失精度浮点十进制值通常没有完全相同的二进制表示形式。 这是 CPU 所采用的浮点数据表示形式的副作用。 为此,可能会经历一些精度丢失,并且一些浮点运算可能会产生意外的结果。

导致此行为的原因是下面之一:

十进制数的二进制表示形式可能不精确。

使用的数字之间类型不匹配(例如,混合使用浮点型和双精度型)。

为解决此行为,大多数程序员或是确保值比需要的大或者小,或是获取并使用可以维护精度的二进制编码的十进制 (BCD) 库。

现在我们就详细剖析一下浮点型运算为什么会造成精度丢失?

1、小数的二进制表示问题

首先我们要搞清楚下面两个问题:

(1) 十进制整数如何转化为二进制数

算法很简单。举个例子,11表示成二进制数:

11/2=5 余 1

5/2=2 余 1

2/2=1 余 0

1/2=0 余 1

0结束 11二进制表示为(从下往上):1011

这里提一点:只要遇到除以后的结果为0了就结束了,大家想一想,所有的整数除以2是不是一定能够最终得到0。换句话说,所有的整数转变为二进制数的算法会不会无限循环下去呢?绝对不会,整数永远可以用二进制精确表示,但小数就不一定了。

(2) 十进制小数如何转化为二进制数

算法是乘以2直到没有了小数为止。举个例子,0.9表示成二进制数

0.9*2=1.8 取整数部分 1

0.8(1.8的小数部分)*2=1.6 取整数部分 1

0.6*2=1.2 取整数部分 1

0.2*2=0.4 取整数部分 0

0.4*2=0.8 取整数部分 0

0.8*2=1.6 取整数部分 1

0.6*2=1.2 取整数部分 0

......... 0.9二进制表示为(从上往下): 1100100100100......

注意:上面的计算过程循环了,也就是说*2永远不可能消灭小数部分,这样算法将无限下去。很显然,小数的二进制表示有时是不可能精确的。其实道理很简单,十进制系统中能不能准确表示出1/3呢?同样二进制系统也无法准确表示1/10。这也就解释了为什么浮点型减法出现了"减不尽"的精度丢失问题。

2、float型在内存中的存储

众所周知、Java 的float型在内存中占4个字节。float的32个二进制位结构如下

float内存存储结构

4bytes 31 30 29----23 22----0

表示 实数符号位 指数符号位 指数位 有效数位

其中符号位1表示正,0表示负。有效位数位24位,其中一位是实数符号位。

将一个float型转化为内存存储格式的步骤为:

(1)先将这个实数的绝对值化为二进制格式,注意实数的整数部分和小数部分的二进制方法在上面已经探讨过了。
(2)将这个二进制格式实数的小数点左移或右移n位,直到小数点移动到第一个有效数字的右边。
(3)从小数点右边第一位开始数出二十三位数字放入第22到第0位。
(4)如果实数是正的,则在第31位放入“0”,否则放入“1”。
(5)如果n 是左移得到的,说明指数是正的,第30位放入“1”。如果n是右移得到的或n=0,则第30位放入“0”。
(6)如果n是左移得到的,则将n减去1后化为二进制,并在左边加“0”补足七位,放入第29到第23位。如果n是右移得到的或n=0,则将n化为二进制后在左边加“0”补足七位,再各位求反,再放入第29到第23位。

举例说明: 11.9的内存存储格式

(1) 将11.9化为二进制后大约是"1011.1110011001100110011001100..."。

(2) 将小数点左移三位到第一个有效位右侧:"1.01111100110011001100110"。保证有效位数24位,右侧多余的截取(误差在这里产生了)。

(3)这已经有了二十四位有效数字,将最左边一位“1”去掉,得到“01111100110011001100110”共23bit。将它放入float存储结构的第22到第0位。

(4) 因为11.9是正数,因此在第31位实数符号位放入“0”。

(5) 由于我们把小数点左移,因此在第30位指数符号位放入“1”。

(6) 因为我们是把小数点左移3位,因此将3减去1得2,化为二进制,并补足7位得到0000010,放入第29到第23位。

最后表示11.9为:

再举一个例子:0.2356的内存存储格式
(1)将0.2356化为二进制后大约是0.00111100010100000100100000。
(2)将小数点右移三位得到1.11100010100000100100000。
(3)从小数点右边数出二十三位有效数字,即11100010100000100100000放
入第22到第0位。
(4)由于0.2356是正的,所以在第31位放入“0”。
(5)由于我们把小数点右移了,所以在第30位放入“0”。
(6)因为小数点被右移了3位,所以将3化为二进制,在左边补“0”补足七
位,得到0000011,各位取反,得到1111100,放入第29到第23位。

最后表示0.2356为:

将一个内存存储的float二进制格式转化为十进制的步骤:
(1)将第22位到第0位的二进制数写出来,在最左边补一位“1”,得到二十四位有效数字。将小数点点在最左边那个“1”的右边。
(2)取出第29到第23位所表示的值n。当30位是“0”时将n各位求反。当30位是“1”时将n增1。
(3)将小数点左移n位(当30位是“0”时)或右移n位(当30位是“1”时),得到一个二进制表示的实数。
(4)将这个二进制实数化为十进制,并根据第31位是“0”还是“1”加上正号或负号即可。

3、浮点型的减法运算

浮点加减运算过程比定点运算过程复杂。完成浮点加减运算的操作过程大体分为四步:
(1) 0操作数的检查;

如果判断两个需要加减的浮点数有一个为0,即可得知运算结果而没有必要再进行有序的一些列操作。

(2) 比较阶码(指数位)大小并完成对阶;

两浮点数进行加减,首先要看两数的指数位是否相同,即小数点位置是否对齐。若两数指数位相同,表示小数点是对齐的,就可以进行尾数的加减运算。反之,若两数阶码不同,表示小数点位置没有对齐,此时必须使两数的阶码相同,这个过程叫做对阶。

如何对阶(假设两浮点数的指数位为Ex和 Ey):

通过尾数的移位以改变Ex或 Ey,使之相等。 由于浮点表示的数多是规格化的,尾数左移会引起最高有位的丢失,造成很大误差;而尾数右移虽引起最低有效位的丢失,但造成的误差较小,因此,对阶操作规定使尾数右移,尾数右移后使阶码作相应增加,其数值保持不变。很显然,一个增加后的阶码与另一个相等,所增加的阶码一定是小阶。因此在对阶时,总是使小阶向大阶看齐,即小阶的尾数向右移位( 相当于小数点左移 ) ,每右移一位,其阶码加 1 ,直到两数的阶码相等为止,右移的位数等于阶差 △E。
(3) 尾数(有效数位)进行加或减运算;

对阶完毕后就可有效数位求和。 不论是加法运算还是减法运算,都按加法进行操作,其方法与定点加减运算完全一样。
(4) 结果规格化并进行舍入处理。

4、 计算12.0f-11.9f

12.0f 的内存存储格式为:

11.9f 的内存存储格式为:


可见两数的指数位完全相同,只要对有效数位进行减法即可。

12.0f-11.9f 结果:

将结果还原为十进制为: 0.00011001100110011010=0.10000038

详细的分析

由于对float或double 的使用不当,可能会出现精度丢失的问题。问题大概情况可以通过如下代码理解:

view plain to clipboardprint?
public class FloatDoubleTest {
public static void main(String[] args) {
float f = 20014999;
double d = f;
double d2 = 20014999;
System.out.println("f=" + f);
System.out.println("d=" + d);
System.out.println("d2=" + d2);
}
}
public class FloatDoubleTest {
public static void main(String[] args) {
float f = 20014999;
double d = f;
double d2 = 20014999;
System.out.println("f=" + f);
System.out.println("d=" + d);
System.out.println("d2=" + d2);
}
}

得到的结果如下:

f=2.0015E7

d=2.0015E7

d2=2.0014999E7

从输出结果可以看出double 可以正确的表示20014999 ,而float 没有办法表示20014999 ,得到的只是一个近似值。这样的结果很让人讶异。20014999 这么小的数字在float下没办法表示。于是带着这个问题,做了一次关于float和double学习,做个简单分享,希望有助于大家对java 浮点数的理解。

关于 java 的 float 和 double

Java 语言支持两种基本的浮点类型: float 和 double 。java 的浮点类型都依据 IEEE 754 标准。IEEE 754 定义了32 位和 64 位双精度两种浮点二进制小数标准。

IEEE 754 用科学记数法以底数为 2 的小数来表示浮点数。32 位浮点数用 1 位表示数字的符号,用 8 位来表示指数,用 23 位来表示尾数,即小数部分。作为有符号整数的指数可以有正负之分。小数部分用二进制(底数 2 )小数来表示。对于64 位双精度浮点数,用 1 位表示数字的符号,用 11 位表示指数,52 位表示尾数

⑥ C语言:浮点数变为整数的一个疑惑

因为你的a做了显式转换也还是有浮点数的形式的,但值确实是变成3了,关键在于双精度浮点数和整型数的差别和printf函数采用的栈输出结构;浮点型的位数比整型高,所以a输入进去以后,有效位数较双精度浮点数较小,因此存在着一堆0值,如:00000000003.1428570000,00000000000003,然而在读时你采用整型,根据编译器的差别可能只读前8位或前四位,你这个数前面那么多0,%d读出来的肯定也是0嘛。其次,int(a)是c++的整型析构函数((int)a才是强制转换(我说的显示转换)),作用是直接提取a的整数部分,用这个做浮点数取整还准确一些,推荐用int(a)以%d输出即可。

⑦ 怎么将c语言中一个浮点型数据的整数部分与小数部分提取出来

代码如下:

#include <stdio.h>

int main(){

double number; //其中number表示输入的数

int zhengshu; //表示实数的整数部分

double xiaoshu; //表示整数的小数部分

printf("请输入一个实数:"); //提示输入一个数

scanf("%lf",&number);

zhengshu = (int)number;

xiaoshu = number-zhengshu;

printf("%f整数部分为:%d,小数部分为:%f ",number,zhengshu,xiaoshu);

return 0;

}。

程序执行结果:

程序设计思路就是输入一个浮点数,把这个浮点强转为整数,C语言强制转换浮点数为整数的话,会丢失精度,也就是小数部分,再把原来的数减去整数部分,就可以得到小数部分,然后定义变量把相应的部分存储,打印出来就行了。

⑧ C语言怎么控制浮点数的输出位数

在c语言中可以通过精度限定符来控制浮点数输出的位数,精度限定符有一个点号后跟一个整数组成。其准确含义依赖于它所修饰的数据类型。示例如下:

#include<stdio.h>
intmain()
{
printf("%.2lf ",1.2345678);
return0;
}

⑨ C语言中对于浮点数进行(int)转换时,计算机是按照四舍五入呢还是只取整数部分

是只取整数部分的。
也就是,可能是1.999999999
然后转换为int就是1,所以
浮点数向int转换,会丢失精度。
为了避免这个,建议如果想取到整数部分。
可以使用
float b;
int a;
a=(b+0.5);
这样写的话,就是四舍五入。
如果
写成
a=b.
可能有
0.99999999999
被截断,
a就是0的情况。

⑩ C语言中float型数据怎么 取整数部分算法 或取小数部分

分析如下:

一种简单的办法是直接强制转换到int型就是整数部分。减去这个int型就是小数部分了。

代码如下:

float n=12.223;
int x=(int)n;
float y=n-(float)x;

得出的x为数据的整数部分,y为数据的小数部分。

拓展资料

浮点型数据类型,FLOAT 数据类型用于存储单精度浮点数或双精度浮点数。浮点数使用IEEE(电气和电子工程师协会)格式。浮点类型的单精度值具有 4 个字节,包括一个符号位、一个 8 位 excess-127 二进制指数和一个 23 位尾数。尾数表示一个介于 1.0 和 2.0 之间的数。由于尾数的高顺序位始终为 1,因此它不是以数字形式存储的。此表示形式为 float 类型提供了一个大约在-3.4E+38 和 3.4E+38 之间的范围。

(资料来源:网络:FLOAT)