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

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

时间2025-06-16 16:52:16分类IT科技浏览4540
导读:[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
ubuntu安装看不到下面的按钮怎么办(Ubuntu: A Love/Hate Relationship: Adventures in Scala: Part I) 如何取得用户信任和权限(如何获得用户信息)