为什么要使用 bigdecimal? 借用<Effactive Java>这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的.然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合.但是,商业计算往往要求结果精确,这时候BigDecimal就派上大用场啦. BigDecimal简介 BigDecimal 由任意精度的整数非标度值 和32 位的整数标度 (scale…
问题的提出:如果我们编译运行下面这个程序会看到什么? public static void main(String args[]){ System.out.println(0.05+0.01); System.out.println(1.0-0.42); System.out.println(4.015*100); System.out.println("BigDecimal:"+new BigDecimal(Double.toString(4.015)).multiply(new B…
计算价格, java中浮点数精度丢失的解决方案…
转自http://blog.csdn.net/seizef/article/details/5571783#ref_1,有删改. 先简单介绍一下浮点数在计算机中的组成,在Java中采用的浮点数表示法是IEEE754标准. 任意一个二进制浮点数V可以表示成下面的形式,进一步说明请参照[1]: (1)(-1)^s表示符号位,当s=0,V为正数:当s=1,V为负数. (2)M表示尾数,范围是[1,2)(规格化)或者是[0,1)(非规范化). (3)2^E表示阶码. 当用浮点数来表示整数时,我们要得到连…
当您在计算Money的时候,请看好了!!!要不损失了别后悔!!! 现象1: public static void main(String[] args) { System.out.println(0.030*100);//输出3.0 System.out.println(0.031*100);//输出3.1 System.out.println(0.032*100);//输出3.2 System.out.println(0.033*100);//输出3.3000000000000003 Syst…
1.long与double在java中本身都是用64位存储的,但是他们的存储方式不同,导致double可储存的范围比long大很多 2.long可以准确存储19位数字,而double只能准备存储16位数字(实际测试,是17位,).double由于有exp位,可以存16位以上的数字,但是需要以低位的不精确作为代价.如果一个大于17位的long型数字存到double上,就会丢失数字末尾的精度 3.如果需要高于19位数字的精确存储,则必须用BigInteger来保存,当然会牺牲一些性能.…
偶然查看Math.round的JDK public static int round(float a) { if (a != 0x1.fffffep-2f) // greatest float value less than 0.5 return (int)floor(a + 0.5f); else return 0; } 注释说0x1.fffffep-2f是最接近0.5的float类型的小数,咦,科学计数法用e表示指数我是知道的,但是这个p是什么鬼.可能有的读者还会问,为什么这个数时最接近0.…
基本数据类型 浮点数存在误差 浮点数有一个需要特别注意的点就是浮点数是有误差的,比如以下这段代码你觉得输出的什么结果: public class Demo { public static void main(String[] args) { System.out.println(0.1+0.2 == 0.3);//输出false } } 这段代码输出值是false,之所以是这个结果那是因为浮点数是存在误差的,也就yi是说0.1在计算机中存储时不是精确的0.1,而有可能是0.1000000001,…
原码:一个正数,转换为二进制位就是这个正数的原码.负数的绝对值转换成二进制位然后在高位补1就是这个负数的原码. 但是原码有几个缺点,零分两种 +0 和 -0 .很奇怪是吧!还有,在进行不同符号的加法运算或者同符号的减法运算的时候,不能直接判断出结果的正负.你需要将两个值的绝对值进行比较,然后进行加减操作 ,最后符号位由绝对值大的决定.于是反码就产生了.反码:正数的反码就是原码,负数的反码等于原码除符号位以外所有的位取反. 解决了加减运算的问题,但还是有正负零之分,然后就到补码了补码:正数的补码与…
为什么Long类型的比float类型的范围小? 2015-09-15 22:36 680人阅读 评论(0) 收藏 举报 版权声明:本文为博主原创文章,未经博主允许不得转载. 作为一个常识,我们都知道浮点型在内存中占用的是4个字节的空间,而long型占用的是8个字节的空间.可是为什么今天在写Java程序时犯了一个错误,最后才知道4个字节 的float型的最大值会大于long型的最大值.发现了这个错误我很吃惊,于是查资料才知道原因. 我们都知道,float类型的范围是:一3.403E38~3.403…