经得起雷劈:关于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
 

相关文章推荐

Java中Double和Long互相转换

public class LongAndDouble { /** * @param args */ public static void main(String[] args) { ...
  • kookob
  • kookob
  • 2012年01月13日 17:14
  • 65338

JAVA中Long与Integer比较容易犯的错误

JAVA中Long与Integer比较容易犯的错误

double转int精度丢失问题

在做学校的acm题时遇到这么一个问题,多余部分已省去,问题部分为: 输入正整数n,取2的n次方的最高位。 由M=2^n,两边取以10为底的对数,logM=nlog2=y 则pow(10,...

C++、C中有关double、float类型转换成int型,及取整,丢失精度问题。

在C++中,我们会将double、float类型转换成int型,准确的说,将double、float类型取整...

double转int时精度不一致问题

float和double类型的主要设计目的是为了科学计算和工程计算。它们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不应该...

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

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

Java中Double和Long互相转换

1、 public static void main(String[] args) { double d = 88.88; long l = ...

java long转换为int 类型 注意事项

public static int subDateFmtStr(String start, String end) { if (start == null || end == null) { ...
  • ying890
  • ying890
  • 2015年12月22日 16:24
  • 4160

关于C++ double浮点数精度丢失的分析

看了一篇关于C/C++浮点数的博文,在Win32下,把int, 指针地址,long等4字节整数赋给一个double后,再用该double数赋给原始类型的数,得到的结果于最初的数值一致,即不存在任何精度...

float和double丢失精度问题,可用Long来转换

public class MainActivity extends Activity { // float f = 533764366.99f; Long f = 53376436623...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:经得起雷劈:关于double和int/long相互转换失去精度计算错误的问题
举报原因:
原因补充:

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