PS:在阅读本篇文章之前,最好先搞清楚:

1.数据类型在计算机内的存储方式;

2.数据类型在VC++或者GCC中的数值范围和精度。

如果对以上两点不清楚,请先阅读另一篇文章《计算机的数据存储及VC++/GCC的数值范围》:

另外,看完本篇文章后,再去学习一下Java的数据类型,能够极大地加深理解。

判断一个数是否是“整型”(int),调用系统函数即可

#include

#include

using namespace std;

int main()

{

double i=3;

cout << typeid(i).name() << endl;

cout << typeid(3.0000).name() << endl;

system("pause") ;

return 0 ;

}

思考:判断一个数是否是“整数”,不能用“类型”来判断,因为实型的3.0和4.00也是整数(只不过是多了几个零罢了)。应该用自定义的函数来判断。

方法:float型的数都有些偏差,比如4.000,只要存到计算机里面它就不是完完全全的4.000,计算机存储实数的时候,是按照指数格式来存储的,所以会有一定的偏差。但是在一定的精度范围之外,我们可以认为它就是整数了。比如:当我们从键盘输入4.000时,它就等于4,虽然储存成实数时,会有一些偏差,但是当我们判断的时候,它应该就是整数;假如我们写成scanf("%lf",&n),并输入4.000,此时判断的结果应该是YES而不是NO(如果输入4.001,则应该输出NO)。

一般人想到的办法是:if ( n - int(n)== 0 )

这种做法是错的,因为左边是double型,右边的0是整型,整型的0永远也不会等于double型的0。即使改成0.00也是错的,因为浮点数有一定误差,4可能成了4.00…01,也可能成了3.99…99,那么4 - int(4)就可能成了0.00…01或者0.99…99。

为了避免这种情况,必须允许和0存在一定的误差,误差范围与数据类型相关,双精度(double型)一般为1e-15,单精度(float型)一般为1e-6,所以应该写成

if(n>=0)

if( (n-(int)n) < 1e-15 || (n-(int)n) > 0.999999999999999 )

//双精度对应1e-15和15个9(单精度对应1e-6和6个9)

printf("YES\n");

else

printf("NO\n");

else

if( -(n-(int)n) < 1e-15 || -(n-(int)n) > 0.999999999999999 )

printf("YES\n");

else

printf("NO\n");

解析:

当n >= 0时,那么只要(n-(int)n) < 1e-15则n就是整数,从而将上面提到的0.000…001的情况排除了;只要(n-(int)n) > 0.999999999999999则n也认为是整数,从而将0.999…999的情况也排除了。

当n <0时,情况类似。只要-(n-(int)n) < 1e-15则n就是整数,将-0.000…001的情况排除了;只要-(n-(int)n) > 0.999999999999999则n就是整数,将-0.999…999的情况排除了。

注意:常量0.99…99的默认存储类型是double型,如果在末尾加L写成0.99…99L,则代表long double型,在VC中long double型和double型没多少区别,所以一般不用它(GCC中可以用)。同理整数末尾也可以加L,代表long int,取值范围是正负21亿多(在32位系统中int和long [int]都是占4个字节,取值范围也一样,所以一般long类型也不常用,64位系统中可以用),例如212345678L(9位数,21亿多)。

完整程序如下:

#include

#include

int main()

{

double n;

while(scanf("%lf",&n)==1)

{

if(n>=0)

if( (n-(int)n) < 1e-15 || (n-(int)n) > 0.999999999999999 )

//双精度对应1e-15和15个9(单精度对应1e-6和6个9)

printf("YES\n");

else

printf("NO\n");

else

if( -(n-(int)n) < 1e-15 || -(n-(int)n) > 0.999999999999999 )

printf("YES\n");

else

printf("NO\n");

}

return 0;

}

实际测试:

double型的有效位数为15位,某些情况能达16位;我们应该用有效范围内的数据以及边界数据作为测试数据。

测试数据预测情况

0.000000000000001(14个0)应该输出NO

0.0000000000000001(15个0)超出有效范围,结果不确定(但很能输出NO)

9.000000000000001(14个0)应该输出NO

9.0000000000000001(15个0)超出有效范围,结果不确定(可能输出YES或NO)

测试结果:

NO

YES

NO

YES

与预期相符,证明这个程序是正确的、实用的。附:Java数据类型

首先要知道:字面量规则

字面量:即我们直接给出的那些整数或者小数。

1.整数字面量为整型(int);

2.小数字面量为浮点型(double)。

//这一点和C/C++是一样的

具体分析见下面简单Java代码的注释:

public class Exerc01{

public static void main(String args []){

byte b = 0;//byte和short例外,可以直接赋整型(int)值

short s = 0;

int i = 0;

long l = 0L;//不加后缀也可以,因为long范围比int大!

float f = 0.0F; //必须加后缀F,因为float范围比double小,可能丢失精度

double d = 0;//写成0,0L,0.0,0.0F都可以!

System.out.println(b);

}

}

java float 判断整数_判断一个数是否是整数相关推荐

  1. java list 为空_判断List集合为空或null

    判断List集合是否为空 Java中,判断List集合是否为空与是否为null并不相同 新建List对象,默认是为空,即没有数据,而不是null 如: List list = new ArrayLis ...

  2. java 以什么开头_判断字符串以什么开头

    Java 判断字符串是否以什么开头 可以使用 startsWith() 判断,例如: String str = "Hello World.";// 判断是否以 Hello 开始Sy ...

  3. java判断日文_判断字符串是否含有日文

    日文字符的Unicode编码范围是: U+3040–U+309F: Hiragana U+30A0–U+30FF: Katakana U+4E00–U+9FBF: Kanji 所以我们只需要对每一个字 ...

  4. java数据类型指定长度_判断(2分) Java的各种数据类型占用固定长度,与具体的软硬件平台环境无关...

    参考答案如下 判断多选(3分) 下列有关我国公平责任的源流以及背景的说法正确的是 各定长度单选(2分) Which word stands for "pessimistic"?( ...

  5. java 第几天_判断这一天是这一年的第几天? 的三种方法! Java

    程序分析: 以3月5日为例,应该先把前两个月的加起来,然后再加.上5天即本年的第 几天. 特殊情况:闰年且输入月份大于3时需考虑多加一天. 闰年的条件: year除以400能整除,或者year除以4能 ...

  6. java获取ie11版本号_判断IE浏览器的版本号

    function IEVersion() { var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串 var isIE = userAgen ...

  7. 如何判断java对象是否存在_判断java对象是否已被gc

    在以往的教科书中说java是采用引用计数算法来决定gc的. 简单描述下引用计数算法:给对象添加一个引用计数器.每当有一个地方引用它时,计数器值就加1:当引用失效时,计数器就减1:任何时刻计数器为0的对 ...

  8. java 无符号运算_不用加减乘除符号实现四则运算(整数)--JAVA

    这种面试题...能想到的就是用位运算代替 在讲解之前,首先普及一点知识 与运算(全一才是一): 0 & 0 = 0 1 & 0 = 0 0 & 1 = 0 1 & 1 ...

  9. sql判断整除_判断整除

    [题目] 一个给定的正整数序列,在每个数之前都插入+号或-号后计算它们的和.所有结果中至少有一个可被整数k整除,我们则称此正整数序列可被k整除. 现判断一个正整数序列是否能被k整除.输入的第一行包含两 ...

最新文章

  1. firebug中html显示为灰色的原因总结
  2. NO.72 参与项目管理、演示和总结
  3. 金山云服务器内网带宽,金山云-文档中心-配置弹性网卡
  4. 中美共建大数据创新研究中心
  5. 小学五年级计算机进度安排,苏教版小学五年级信息技术教学计划及进度安排.DOC...
  6. Office365—Exchange管理4—通讯组和安全组
  7. docker运行镜像报错:write init-p: broken pipe
  8. html字幕字体大小,HTML字体集锦-
  9. gedit c语言,让gedit 成为强大的C语言IDE
  10. Python求解拉普拉斯矩阵及其特征值
  11. WMware15和虚拟机Win10镜像文件网盘分享
  12. struts1的配置文件详解
  13. 欧洲花费210亿欧元新建大型对撞机,我国要跟进吗?
  14. java 代码加壳,专家和您一同谈谈java加壳的问题[Java编程]
  15. css3制作菱形图片
  16. 谷歌浏览器fash弹框的设置
  17. 如何更换Tomcat默认主页
  18. SQLserver创建代理作业
  19. 离散数学1_第1章_复合命题与联结词
  20. android内存最小版本下载,侠盗猎车手最小内存版本-侠盗猎车手内存小版本下载-游戏大玩家...

热门文章

  1. 2020年GitHub上50个最受程序员欢迎的PHP开源项目
  2. 美国访学的一些心得体会与注意事项
  3. Pedestrian Detection paper
  4. 巴比特 | 元宇宙每日荐读:三位手握“价值千万”藏品的玩家,揭秘数字藏品市场“三大套路”...
  5. python调用pandas保存excel
  6. sumo交通流仿真软件的使用说明
  7. 苹果wifi网速慢怎么办_家里网速慢如何解决 提高WiFi网速方法【详解】
  8. 3373. 进制转换(高精度除法)
  9. 做项目和做产品有什么区别
  10. [转]数码单反和普通数码相机的差别