首页IT科技decimal取值范围(BigDecimal精度详解)

decimal取值范围(BigDecimal精度详解)

时间2025-05-05 19:38:50分类IT科技浏览3581
导读:[BigDecimal精确度的计数保留法及精度丢失的解决办法] BigDecimal精确度的计数保留法...

[BigDecimal精确度的计数保留法及精度丢失的解决办法]

BigDecimal精确度的计数保留法

在银行         、帐户                、计费等领域            ,BigDecimal提供了精确的数值计算            。其中8种舍入方式值得掌握               。

1      、ROUND_UP

舍入远离零的舍入模式    。 在丢弃非零部分之前始终增加数字(始终对非零舍弃部分前面的数字加1)         。 注意               ,此舍入模式始终不会减少计算值的大小                。 BigDecimal bd = new BigDecimal("2.18491"); //2.19 System.out.println(bd.setScale(2, BigDecimal.ROUND_UP));

2       、ROUND_DOWN

接近零的舍入模式      。 在丢弃某部分之前始终不增加数字(从不对舍弃部分前面的数字加1    ,即截短)      。 注意         ,此舍入模式始终不会增加计算值的大小                 。 BigDecimal bd = new BigDecimal("2.18491"); //2.18 System.out.println(bd.setScale(2, BigDecimal.ROUND_DOWN));

3               、ROUND_HALF_UP

向“最接近的         ”数字舍入                ,如果与两个相邻数字的距离相等      ,则为向上舍入的舍入模式        。 如果舍弃部分 >= 0.5      ,则舍入行为与ROUND_UP相同;否则舍入行为与ROUND_DOWN相同   。 注意                 ,这是我们大多数人在小学时就学过的舍入模式(四舍五入)                  。 BigDecimal bd = new BigDecimal("2.18491"); //2.18 System.out.println(bd.setScale(2, BigDecimal.ROUND_HALF_UP)); BigDecimal bd1 = new BigDecimal("2.18591"); //2.19 System.out.println(bd1.setScale(2, BigDecimal.ROUND_HALF_UP));

4         、ROUND_HALF_DOWN

向“最接近的                ”数字舍入        ,如果与两个相邻数字的距离相等   ,则为向下舍入的舍入模式           。 如果舍弃部分 > 0.5                  ,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同(五舍六入)。 BigDecimal bd = new BigDecimal("2.18500"); //2.18 System.out.println(bd.setScale(2, BigDecimal.ROUND_HALF_DOWN)); BigDecimal bd1 = new BigDecimal("2.18510"); //2.19 System.out.println(bd1.setScale(2, BigDecimal.ROUND_HALF_DOWN));

5     、ROUND_HALF_DOWN 银行家舍入法

向“最接近的      ”数字舍入           ,如果与两个相邻数字的距离相等,则向相邻的偶数舍入               。

如果舍弃部分左边的数字为奇数               ,则舍入行为与 ROUND_HALF_UP 相同;

如果为偶数              ,则舍入行为与 ROUND_HALF_DOWN 相同              。

注意  ,在重复进行一系列计算时            ,此舍入模式可以将累加错误减到最小  。

此舍入模式也称为“银行家舍入法       ”               ,主要在美国使用            。四舍六入    ,五分两种情况               。

如果前一位为奇数         ,则入位                ,否则舍去    。

以下例子为保留小数点1位      ,那么这种舍入方式下的结果         。

1.15>1.2 1.25>1.2

6              、ROUND_CEILING

接近正无穷大的舍入模式                。

如果 BigDecimal 为正      ,则舍入行为与 ROUND_UP 相同;

如果为负                 ,则舍入行为与 ROUND_DOWN 相同      。

注意        ,此舍入模式始终不会减少计算值      。

7            、ROUND_FLOOR

接近负无穷大的舍入模式                 。

如果 BigDecimal 为正   ,则舍入行为与 ROUND_DOWN 相同;

如果为负                  ,则舍入行为与 ROUND_UP 相同        。

注意           ,此舍入模式始终不会增加计算值   。

8   、ROUND_UNNECESSARY

断言请求的操作具有精确的结果,因此不需要舍入                  。

如果对获得精确结果的操作指定此舍入模式               ,则抛出ArithmeticException           。

BigDecimal精度丢失的问题

BigDecimal bdTest = new BigDecimal(1.745); BigDecimal bdTest1 = new BigDecimal(0.745); bdTest = bdTest.setScale(2, BigDecimal.ROUND_HALF_UP); bdTest1 = bdTest1.setScale(2, BigDecimal.ROUND_HALF_UP); System.out.println("bdTest:" + bdTest); // 1.75 System.out.println("bdTest1:" + bdTest1); // 0.74

运行以上代码可以看到              ,1.745四舍五入的结果是1.75  ,0.745四舍五入的结果是0.74。

原因

使用参数为float或double的BigDecimal创建对象会丢失精度               。因此强烈建议不要使用参数为float或double的BigDecimal创建对象              。

System.out.println(new BigDecimal(1.745)); // 1.74500000000000010658141036401502788066864013671875 System.out.println(new BigDecimal(0.745)); // 0.74499999999999999555910790149937383830547332763671875

解决方案

使用BigDecimal(String val)的构造方法创建对象 new BigDecimal("1.745"); 使用使用BigDecimal的valueOf(double val)方法创建对象 BigDecimal.valueOf(1.745);

参考链接

BigDecimal.ROUND_HALF_XXX的各种用法 BigDecimal精度丢失
声明:本站所有文章            ,如无特殊说明或标注               ,均为本站原创发布  。任何个人或组织    ,在未征得本站同意时         ,禁止复制              、盗用               、采集、发布本站内容到任何网站           、书籍等各类媒体平台            。如若本站内容侵犯了原著者的合法权益                ,可联系我们进行处理               。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
正在移除其创建的分区要多久(ipcrm命令 – 移除一个消息对象、共享内存段或信号集)