经得起雷劈:关于double和int/long相互转换失去精度计算错误的问题

转载 2015年11月18日 13:18:59

http://blog.csdn.net/vonger/article/details/6656219

在用C/C++做运算时,类型转换是很常见的,一般都直接用数据类型进行默认强制转化,但是这样其实是有很大问题的。


[html] view plaincopy
  1. #include <stdio.h>  
  2. int main(int argc, char *argv[])  
  3. {  
  4.     double x = 2.01;  
  5.     int y = x * 100;  
  6.     printf("y = %d\n", y);  
  7.     return 0;  
  8. }  



这个例子一眼看过去,很简单嘛,应该是输出201, 但是实际运行结果确是200...200和201的差距可是相当大了,足够让火箭坠毁动车被雷劈了 :)

所以,我们作为无证程序员,要写出经得起雷劈的程序,这些想当然的BUG必须是要规避的。我采用的是double转换int末位四舍五入的方法。
代码如下


  1. inline int double2int(double in)  
  2. {  
  3.     return in > 0 ? (in + 0.5) : (in - 0.5);  
  4. }  


这样得到的就是正确的结果了。


  1. #include <stdio.h>  
  2. int main(int argc, char *argv[])  
  3. {  
  4.     double x = 2.01;  
  5.     int y = double2int(x * 100);  
  6.     printf("y = %d\n", y);  
  7.     return 0;  
  8. }  


现在来分析根本原因:
由于浮点和整形的保存方法是完全不同的,所以double y = 2.01在内存中实际是
FF FF FF FF FF 1F 69 40
经过IEEE的标准换算过来其实是2.00999999997, 这样,乘以100后得到200.99999997,强制转换整形的算法是向下取整,这样导致结果成了200
 

long long类型转double类型部分精度丢失问题

我最近做了一道题,一个64位(unsigned __int64)范围内的数输出其除以1000的值,并按四舍五入保留小数点后三位。 我刚开始直接写WA,结果发现当数比较大的时候,结果后几位精度总会丢失,...
  • dzz0119
  • dzz0119
  • 2015年08月11日 17:56
  • 3997

java数值范围以及float与double精度丢失问题

1.java中int,float,long,double取值范围 public class TestOutOfBound { public static void main(String[] args...
  • tomcat_2014
  • tomcat_2014
  • 2016年05月19日 15:15
  • 5501

java中Double类型的运算精度丢失的问题 (小数点多出99999999999999)

在使用Java,double 进行运算时,经常出现精度丢失的问题,总是在一个正确的结果左右偏0.0000**1。 特别在实际项目中,通过一个公式校验该值是否大于0,如果大于0我们会做一件事情,小于0我...
  • jdsjlzx
  • jdsjlzx
  • 2015年08月25日 16:12
  • 13532

java Byte和各数据类型(short,int,long,float,double)之间的转换

在Java的网络编程中传输的经常是byte数组,但我们实际中使用的数据类型可能是任一种数据类型,这就需要在它们之间相互转换,转换的核心在于将其他类型的数据的每一位转换成byte类型的数据。下面给出相关...
  • caoshichao520326
  • caoshichao520326
  • 2013年08月09日 14:43
  • 10907

Java中byte数组与short,int,char,long,float,double之间的转换

某些场景下我们接受和发送的数据都是byte数组,例如在socket传输中,发送、者接收的数据都是 byte数组,或者是自定义传输协议或者文件格式中,为了保证数据安全、节省流量服务端需要对数据进行先加密...
  • FX_SKY
  • FX_SKY
  • 2014年02月28日 11:20
  • 2533

java的int、char、long、float、double对byte的转换

【原文地址】http://xuliduo.iteye.com/blog/1126957package com.util; /** * * * 文件名称: com.born.util.Byt...
  • tungkee
  • tungkee
  • 2012年05月09日 11:35
  • 3573

c++中的一些类型转换 : CString,string,int ,long,double,char*,const char*,date等

c++中的一些类型转换 : CString,string,int ,long,double,char*,const char*,date等 C/C++ 2009-12-26 12:40:07 阅读10...
  • wanwanfd
  • wanwanfd
  • 2011年04月14日 19:51
  • 443

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

在JAVA中string是final类,提供字符串不可以修改,string类型在项目中经常使用,下面给大家介绍比较常用的string数据类型转换: String数据类型转换成long、int、dou...
  • qq_34675830
  • qq_34675830
  • 2017年01月04日 11:18
  • 673

java中String,int,Integer,char,Long,Float,Double,Date 类型转换

如何将字串 String 转换成整数 int?  int i = Integer.valueOf(my_str).intValue(); int i=Integer.parseInt(str); ...
  • wanglei880526
  • wanglei880526
  • 2014年01月16日 11:46
  • 4662

c++中的一些类型转换 : CString,string,int ,long,double,char*,const char*,date等 .

http://blog.sina.com.cn/s/blog_6e7fed390100xiiz.html     最近做项目用到c++,才发现c++中的数据类型不是一般的BT。尤其是...
  • zebincai
  • zebincai
  • 2012年08月30日 21:43
  • 404
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:经得起雷劈:关于double和int/long相互转换失去精度计算错误的问题
举报原因:
原因补充:

(最多只允许输入30个字)