2 qq 28195487 qq_28195487 于 2016.02.20 16:04 提问

为什么会溢出呢?求java大神指教

public class Test6{

public static void main(String[]args){

    int size=10;
    double [] myList=new double[size];
    myList[0]=1.2;  
    myList[1]=1.3;  
    myList[2]=1.0;  
    myList[3]=1.0;  
    myList[4]=1.0;  
    myList[5]=1.0;  
    myList[6]=1.0;  
    myList[7]=1.0;  
    myList[8]=1.6;
    myList[9]=1.2;  

    double total=0;
    for(int i=0;i<size;i++){
        total+=myList[i];
    }
    System.out.print("Total is:"+total);
}

}

打印结果是Total is :11.299999999999

为什么打印不出11.3

4个回答

caozhy
caozhy   Ds   Rxr 2016.02.21 07:08
已采纳

double有两个误差,一个是2进制和10进制转换的误差,一个10进制为整的数字,比如1.1,用二进制表示,就是一个无限循环小数。但是计算机的字长不是无限的,所以有误差。
另一个是浮点本身的计算误差一个很大的double值+一个很小的double值,那么很小的值没办法在前一个数字有效尾数上表示,甚至会被忽略,或者精度损失。
由于以上两点,浮点数计算和显示会出现误差。

qq_28195487
qq_28195487 谢谢大神,回答的好详细,我一下子就明白了
2 年多之前 回复
wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.02.20 16:56

这不是溢出,是double类型精确度问题,如果需要舍入可以选择另一种BigDecimal这种数值类型,它有数值运算,并且可以指定舍入类型。

sddzsddz
sddzsddz   2016.02.20 16:11

BigDecimal 用这个来计算哦
浮点型数据操作是不精确的

luochoudan
luochoudan   Ds   Rxr 2016.02.20 21:08

非溢出,精度问题,楼上已解释。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
关于Csharp通过url下载的问题
为什么documentComplete 就是不起作用呢?为什么反复的循环呢?求大神解释下
有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
第一种解法: [cpp] view plaincopyprint? /*  *copyright@nciaebupt 转载请注明出处  *问题:有两个序列a,b,大小都为n,序列元素的值任意整数,无序;  *要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。  *比如 a=[100 ,99 ,98
工具栏测试
传上来请教大神的。。。 用完会删掉 为什么一定要20个字呢 不合理啊 不合理
n的阶乘会溢出?解决超大数字阶乘溢出问题。
在我们面试时通常会遇到阶乘的问题,当然最简单的就是运用递归,循环所求的阶乘数: 不多数,直接上代码: /** * 实现10的阶乘 * @author fx * */ public class JieCheng { public static void main(String[] args) { System.out.println(getFact
计算器小型应用
小型计算器功能不太完善 求各位大神指教
原码,反码,补码的溢出计算
byte by = (byte)130 ;因为java中整数默认为int类型,我们先把130用二进制表示出来,我们使用8421码快速转换得到   10000010在内存中数据用补码表示,而130是一个正数,原码、反码、补码一样又因为int类型在内存中占用四个字节,所以130在内存中的表示如下00000000 00000000 00000000 10000010当我们对130强制转换时,因为byte...
溢出避免:求平均数
好久不见…… 这次来说说求平均数的问题。 问题很简单,就是求 (a+b)/2。 当然,我不是让你直接printf(“%d”,(a+b)/2); 这样随便一个人学一小时C语言就可以做到。 问题是 a+b 如果溢出了怎么办?溢出的话就得不到正确结果了,这样该怎么解决? 如果简单的避免溢出,将程序改成 a/2+b/2,这样也是不对的,这样会在a,b都为奇数时导致缺失。 还有人会给出 a+
进位和溢出
通过对结果的分析,得出以下溢出和进位的确定方式: 不管你把数据视为无符号还是有符号,计算时自动把最高位视为符号位.当两个符号位相同的数做加法时,如果结果的符号位发生变化,则为溢出.当两个符号位不同的数做减法时,以A-B=C为例,如果A与C的符号位不同则为溢出.其它情况下均不会有溢出.关于进位:当两个数相加的结果的长度增大时会产生进位.如果将数看作无符号的(不管机器如何看待它们),小数减大数一
byte数据溢出详解
在Java中,使用byte数据类型运算,可能会得到一些意想不到的结果,我们来看看下面的例子: ###运行该程序后,得到的结果如下图所示: ####我们称这种问题为:**byte数据溢出**问题。要想了解这种问题的出现的原因,需要先明确Java中byte数据类型存储占用一个字节,即8个二进制位。还得掌握原码、反码、补码。众所周知,计算机存储的数据都是以二进制形式体现的,即(0,1)有符号数有3种表示...
一个防止溢出的求平均方法
起因 http://bbs.csdn.net/topics/390510593