DOUBLE精度问题,BigDecimal

  BigDecimal bignum1 = new BigDecimal("10");
        BigDecimal bignum2 = new BigDecimal("5");
        BigDecimal bignum3 = null;
        
        //加法
        bignum3 =  bignum1.add(bignum2);     
        System.out.println("和 是:" + bignum3);
        
        //减法
        bignum3 = bignum1.subtract(bignum2);
        System.out.println("差  是:" + bignum3);
        
        //乘法
        bignum3 = bignum1.multiply(bignum2);
        System.out.println("积  是:" + bignum3);
        
        //除法
        bignum3 = bignum1.divide(bignum2);

比较大小

BigDecimal比较大小
   这个类是java里精确计算的类,下面说一下两个BigDecimal对象大小,相等的判断
   1 比较对象是否相等
     一般的对象用equals,但是BigDecimal比较特殊,举个例子:
     BigDecimal a=BigDecimal.valueOf(1.0);
     BigDecimal b=BigDecimal.valueOf(1.000);

在现实中这两个数字是相等的,但是如果用
     a.equals(b)结果是false;怎么不相等了呢?因为equals是比较内容,“1.0”和“1.000”当然不一样了

解决办法:
            if(a.compareTo(b)==0) 结果是true

简单翻译:
           结果是
-1 小于  
0 等于
1 大于

异常

用两个BigDecimal类型的数字做除法运算时,出现了一个如下的异常信息:

1 java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result

  上网查了一下这个异常的,找到了原因所在:通过BigDecimal的divide方法进行除法时当不整除,出现无限循环小数时,就会抛异常:java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. 
  解决的办法就是给divide方法设置精确的小数点,如:divide(xxxxx,2)。

时间: 2024-07-31 17:36:24

DOUBLE精度问题,BigDecimal的相关文章

double精度的坑与BigDecimal

近期经常接触支付相关的功能,在开发及测试过程中,开始金额都使用的是double类型,而近期新进的需求存在支付时打折的情况,也就是会出现如 1.23元的情况,那么这时候问题来了,如果是直接使用1.23进行支付都是不存在问题的.而偏偏在支付前通常需要一些计算.我们的系统支持会员余额与三方支付(微信.支付宝)同时进行,比如一笔待支付的订单是12.8员,其中用户有5块钱的会员余额,剩下的7.8元通过三方支付进行(这里使用微信吧),那么就涉及到double减法,同时微信支付时需要将元转为分,就是7.8x1

Java中关于 BigDecimal 的一个导致double精度损失的"bug"

背景 在博客 恶心的0.5四舍五入问题 一文中看到一个关于 0.5 不能正确的四舍五入的问题.主要说的是 double 转换到 BigDecimal 后,进行四舍五入得不到正确的结果: public class BigDecimalTest { public static void main(String[] args){ double d = 301353.05; BigDecimal decimal = new BigDecimal(d); System.out.println(decima

Java面试官:兄弟,你确定double精度比float低吗?

我有一个朋友,叫老刘,戴着度数比我还高的近视镜,显得格外的"程序员":穿着也非常"不拘一格",上半身是衬衣西服,下半身是牛仔裤运动鞋. 我和老刘的感情非常好,每周末我们都要在一起吃顿饭.这周,我们吃的是洛阳有名的吴家刀削面,席间他聊了一件蛮有趣的面试经历:我听得津津有味. 散席的时候,老刘特意叮嘱我把他和面试者的对话整理一下发出来,因为他觉得这段对话非常的精彩,值得推荐给更多初学Java的年轻人. 注:以下是老刘和面试者东丰的真实对话.如有雷同,请勿对号入座. 老刘

float和double精度问题

System.out.println(new BigDecimal(253.90).doubleValue() * 100);25390.0精度正确 System.out.println(new BigDecimal(255.90).doubleValue() * 100);25590.0精度正确 System.out.println(new BigDecimal(256.10).doubleValue() * 100);25610.000000000004精度错误 System.out.pri

java float double精度为什么会丢失?浅谈java的浮点数精度问题 【转】

由于对float或double 的使用不当,可能会出现精度丢失的问题.问题大概情况可以通过如下代码理解: [java] view plaincopyprint? public class FloatDoubleTest { public static void main(String[] args) { float f = 20014999; double d = f; double d2 = 20014999; System.out.println("f=" + f); System

C语言中关于float、double、long double精度及数值范围理解

IEEE754浮点数的表示方法.C语言里对float类型数据的表示范围为-3.4*10^38-+3.4*10^38.double为-1.7*10^-308~1.7*10^308,long double为-1.2*10^-4932~1.2*10^4932. 类型 比特(位)数 有效数字 数值范围 float 32 6~7 -3.4*10^38-+3.4*10^38 double 64 15~16 -1.7*10^-308~1.7*10^308 long double 128/ 18~19 -1.2

【转】JAVA程序中Float和Double精度丢失问题

原文网址:http://blog.sina.com.cn/s/blog_827d041701017ctm.html 问题提出:12.0f-11.9f=0.10000038,"减不尽"为什么? 来自MSDN的解释: http://msdn.microsoft.com/zh-cn/c151dt3s.aspx 为何浮点数可能丢失精度浮点十进制值通常没有完全相同的二进制表示形式. 这是 CPU 所采用的浮点数据表示形式的副作用.为此,可能会经历一些精度丢失,并且一些浮点运算可能会产生意外的结果

【转载】VB6里面,double精度都不够用怎么办?

double类型的精度确实是可定义类型中最高的,但有效数字为15或16位另一种Decimal 数据类型有效位可达到28或29位,但不含指数位应该可以这样理解:Decimal精度更高但示数范围小:double反之而且Decimal 数据类型只能在 Variant中使用,也就是说,不能声明一变量为 Decimal 的类型上面有高手给了你利用Decimal 数据类型解决例题的办法. 另外如果需要,还可以自己定义变量或数组来记录超大数,有效位和示数范围上不封顶,不过进位借位等等操作只有自己解决了 Dim

springmvc中@PathVariable传Double精度丢失

页面请求 http://localhost:8080/test/3.201 后端接受数据 /** * 测试 * * @param number */ @RequestMapping(value = "/test/{number}", method = RequestMethod.GET) public void test(@PathVariable Double number) { System.out.println("数字:" + number); } 结果 数