double float的精度问题

三部曲

1:

 #include <iostream>
 #include <stdio.h>
 #include <string.h>

 using namespace std;

 int main()
 {
     double a=0.0001;
     float b=0.1;
     int c=(int)(a*1000)/b;
     cout<<c<<endl;
 }     ///期望c==1   结果c却==0

2:

 #include <iostream>
 #include <stdio.h>
 #include <string.h>

 using namespace std;

 int main()
 {
     double a=0.0001;
     float b=0.1;
     int c=(int)(a*1000)/b;
      printf("%.15lf\n",b);///实验结果证明  float转成double时出现了精度问题
     cout<<a<<endl;
     cout<<c<<endl;    ///int向上取整  所以==0了
 }

3:

#include <iostream>
 #include <stdio.h>
 #include <string.h>

 using namespace std;

 int main()
 {
     double a=0.0001;
     double b=0.1;      ///我将float变成double  就OK了
     int c=(int)(a*1000)/b;
      printf("%.15lf\n",b);
     cout<<a<<endl;
     cout<<c<<endl;
 }

4::::

double f;

int num =(int) f*100;

结果是:输入f = 1.23,  输出 num = 122.

  输入f = 1.25  输出 num =125

这就是著名的double精度损失问题。

因为1.23在计算机里面只能表示为近似值:1.2299999999.........

而1.25却能被精确的表示:

解决的办法是:

int num = (int)(f*100+0.0001),这个0.0001根据你需要的精度来设置,是可以改变的

这时候,不管f=1.23还是f=1.25,结果都是我们想要的123和125.

关键是要理解:  10110101 只是近似等于 1.0110101 * 2^7.

int float double 之间的关系是 int可以隐式转换成double 和float;
                                         float只能强制转换成int  但是可以隐式转换成double;
                                         double只能强制转换成int和float
 int与float之间的转换精度会缺失 当int——>float——>int时   两个int已经不相等了
 double与float之间的转换精度也会缺失 当double——>float——>double时  两个double不相等了
::::计算机以二进制存储数据  小数的二进制有可能会丢失数据 所以会存在误差   而int型二进制会除尽  不存在误差

时间: 2024-10-03 22:49:27

double float的精度问题的相关文章

Java中浮点类型的精度问题 double float

要说清楚Java浮点数的取值范围与其精度,必须先了解浮点数的表示方法与浮点数的结构组成.因为机器只认识01,你想表示小数,你要机器认识小数点这个东西,必须采用某种方法.比如,简单点的,float四个字节,前两个字节表示整数位,后两个字节表示小数位(这就是一种规则标准),这样就组成一个浮点数.而Java中浮点数采用的是IEEE 754标准. IEEE 754 标准 更多详见:https://baike.baidu.com/item/IEEE%20754 IEEE 754 标准是IEEE二进位浮点数

iOS - Json解析精度丢失处理(NSString, Double, Float)

开发中处理处理价格金额问题, 后台经常返回float类型, 打印或转成NSString都会有精度丢失问题, 因此使用系统自带的NSDecimalNumber做处理, 能解决这问题:经过测试其实系统NSDecimalNumber是对有问题值做了四舍五入处理 ?    还有经过测试, 重要的事说三遍:?处理精度有关的数据请用double?处理精度有关的数据请用double?处理精度有关的数据请用double     float testDouble = [jsonDict[@"Body"]

c#中decimal ,double,float的区别

转自:http://www.cnblogs.com/lovewife/articles/2466543.html 单精度就是指4个字节的浮点数,即float双精度就是指8个字节的浮点数,即double decimal是高精度 浮点型 Name CTS Type Description Significant Figures Range (approximate) float System.Single 32-bit single-precision floating point 7 ±1.5 ×

java double 计算损失精度

计算double类型的数时有时候会多出0.000000001,会有不确定个数的0,在计算时将其转为BigDecimal就不会出错. BigDecimal sum = new BigDecimal(0.0);                BigDecimal tmp = new BigDecimal(0.0);                for(int i=0; i<list.size(); i++){                    tmp = new BigDecimal(list

double,失去精度

double,失去精度: amount.doubleValue() * 100 原文地址:https://www.cnblogs.com/xiluhua/p/8727921.html

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

NSString 转换 float 的精度问题, 换double类型可以解决

@"0.01" 转换成float时, 经常会变成  0.009999799 这种形式, 因为float类型无法精准保存, 系统会选一个接近的值来代替. 而double类型则可以有更好的精度. http://stackoverflow.com/questions/9328260/converting-nsstring-to-float-adds-in-decimal-places Your issue seems to be that you don't understand how f

Java中的浮点型(Double&amp;Float)计算问题

在刚刚做完的一个项目中,遇到了double型计算不精确的问题.到网上查找后,问题得到解决.经验共享,在这里总结一下. Java中的浮点数类型float和double不能够进行精确运算.这个问题有时候非常严重.比如,经过double型直接计算,1.4×1.5有时会得出2.0999999999999996的结果,但实际上,应该得到2.10.而且,类似的情况并不仅限于乘法计算. 在有的编程语言中提供了专门的货币类型来处理这种情况,但是Java没有.所以,在商业计算中我们要用:java.math.Big

[坑]c#中double转字符串精度丢失问题记录

在项目遇到了一个比较大的double值,然后出现了一些意想不到的状况: double b=1141.161994934082; b.ToString();//'1141.16199493408' 然后发现最后的一个2被丢弃了,最后经过测试这个跟double的数字位数有关,如果超过16位,最后一位就会被丢弃,也就是说2是第17位,所以被丢弃了,找了很多的办法都没有解决这个问题,所以记录一下. 在sql server 2014存进去这个数字的时候,是没有问题的,但是从查询管理器看到的数字也是少了一个