Double 与 Float 的值的比较结果

首先看geeksforgeeks上的两个程序:

程序1:

#include<stdio.h>
int main()
{
    float x = 0.1;
    if (x == 0.1)
        printf("IF");
    else if (x == 0.1f)
        printf("ELSE IF");
    else
        printf("ELSE");
}

程序2:

#include<stdio.h>
int main()
{
    float x = 0.5;
    if (x == 0.5)
        printf("IF");
    else if (x == 0.5f)
        printf("ELSE IF");
    else
        printf("ELSE");
    system("pause");
	return 0;
}

程序1输出是:ELSE IF, 而程序2,输出是:IF

为什么呢?

这是因为double和float的精度不一样,如果小数转换为二进制的时候是无限循环的话,那么就会出现对比值不一样,比如0.1,否则就可以比较float和double,结果值相等,比如0.5.

这就需要应用到小数转换为二进制的知识了,所谓的乘2取整法。

如0.1转换为二进制为:

0.1 * 2 = 0.2 ---- 整数为0,故取该位为0

0.2*2 = 0.4 -----整数为0,继续取0

0.4*2 = 0.8 -----整数为零,取零

0.8*2 = 1.6-----整数为1,取1

0.6*2 = 1.2----取1

0.2*2 = 0.4---取零,和前面循环了。

故此0.1(base 10) == 0.00011 0011 0011...(0011为无限循环数位值)

这样的数取不同精度,那么肯定会导致其值不一样的了。

故此:(float)0.1 != double(0.1)

但是0.5(base 10) = 0.1(base 2),没有无限循环数位

故此:(float)0.5 == double(0.5)

参考:http://www.geeksforgeeks.org/comparison-float-value-c/

Double 与 Float 的值的比较结果

时间: 2024-08-28 22:29:14

Double 与 Float 的值的比较结果的相关文章

Double 与 Float 的值的比較结果

首先看geeksforgeeks上的两个程序: 程序1: #include<stdio.h> int main() { float x = 0.1; if (x == 0.1) printf("IF"); else if (x == 0.1f) printf("ELSE IF"); else printf("ELSE"); } 程序2: #include<stdio.h> int main() { float x = 0.

Swift入门(九)——String与Int、Double、Float等数字相互转换

三种转换模式 任何语言里面,Int.float.double等数字类型自成一派,但它们和String类型之间的转换总是不太方便,这里总结一下它们相互转换的方法.总结下来一共有三种转换模式,分别举例说明. 一.String转数字 这里以String类型转Int类型为例.String转其他的数字类型(Float.Double等)大同小异.主要用到的方法是String类型的toInt方法.注意这个方法返回的是Int?,即一个整数可选类型.所以需要解封. var string = "1234"

java用double和float进行小数计算精度不准确

java用double和float进行小数计算精度不准确 大多数情况下,使用double和float计算的结果是准确的,但是在一些精度要求很高的系统中或者已知的小数计算得到的结果会不准确,这种问题是非常严重的. <Effective Java>中提到一个原则,那就是float和double只能用来作科学计算或者是工程计算,但在商业计算中我们要用java.math.BigDecimal,通过使用BigDecimal类可以解决上述问题,java的设计者给编程人员提供了一个很有用的类BigDecim

double 和 float

对编程人员来说,double 和 float 的区别是double精度高,有效数字16位,float精度7位.但double消耗内存是float的两倍,double的运算速度比float慢得多,C语言中数学函数名称double 和 float不同,不要写错,能用单精度时不要用双精度(以省内存,加快运算速度). 1 范围 float和double的范围是由指数的位数来决定的. float的指数位有8位,而double的指数位有11位,分布如下: float: 1bit(符号位) 8bits(指数位

String数据类型转换成long、int、double、float、boolean、char等七种数据类型

String c="123456"; //当String类型数据 要转换成int.double.float.long等数据类型时,其数据必须由数字构成, //当String类型数据由汉字或字母组成时转换成int.double.float.long等数据类型时,程序报错 //String类型转换成long类型 //String类型数据转换成long类型时 String类型的数据必须是数字构成 long n=Long.parseLong(c); System.out.println(&qu

double、float,哪个更快?

假设精度足够的情况下,double和float哪个更快? 有人说,float更快,因为需要处理的数据量少,有人说,double快,因为最终CPU在进行计算时需要先把float转换为double.真相如何呢? VC++的编译器设置里有三种浮点模型,这三种浮点模型有什么区别呢?对运算速度又有什么影响呢? 测试环境:Visual Studio 2013 update2,Intel(R) Core(TM) i5-2320 CPU @ 3.00GHz 测试代码: #include "stdafx.h&qu

Java double和 float丢失精度问题

详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt357 由于对float或double 的使用不当,可能会出现精度丢失的问题.问题大概情况可以通过如下代码理解: public class FloatDoubleTest { public static void main(String[] args) { float f = 20014999; double d = f; double d2 = 20014999; Syst

Java中如何解决double和float精度不准的问题

我们知道浮点数是无法在计算机中准确表示的,例如0.1在计算机中只是表示成了一个近似值,因此,对付点数的运算时结果具有不可预知性. 在进行数字运算时,如果有double或float类型的浮点数参与计算,偶尔会出现计算不准确的情况.如以下示例代码: package ex; public class BigDeciTest { public static void main(String[] args){ System.out.println(0.05+0.01); System.out.printl

报错:float 返回值是“-nan”

报错:float 返回值是个"-nan". vim coordinates.h vim coordinates.c gcc -lm coordinates.c -DD ./a.out 程序执行后返回了 1. ------------------------------ 仔细查看后,发现在函数中算式写错了.把"减号",改成"加号". 再编译执行后.