BigDecimal舍入模式总结及运用场景分析

目录

1、数字舍入模式

1.1、ROUND_UP

1.2、ROUND_DOWN

1.3、ROUND_HALF_UP

1.4、ROUND_HALF_DOWN

1.5、ROUND_HALF_EVEN

1.6、ROUND_CEILING

1.7、ROUND_FLOOR

2、舍入模式举例

2.1、保留3位小数

2.2、保留1位小数

2.3、保留0位小数

3、应用场景分析

3.1、四舍五入

3.2、无条件进位

3.3、无条件舍位

3.4、反向抹零

4、总结


1、数字舍入模式

方法:BigDecimal#setScale(int newScale, int roundingMode)

描述:
返回一个BigDecimal,其标度为指定值,其未标度值通过将此BigDecimal的未标度值乘以或除以适当的 10 次方来确定,以保持其整体值。

参数:

  • newScale:返回的BigDecimal值的小数位数
  • roundingMode:舍入模式

返回:
一个BigDecimal,其标度为指定值,其未标度值通过将此BigDecimal的未标度值乘以或除以十的适当幂来确定,以保持其整体值。

注意:

  • 如果通过操作缩小比例,则必须将未缩放的值除(而不是相乘),并且值可能会改变;在这种情况下,指定的舍入模式应用于除法。
  • 由于 BigDecimal 对象是不可变的,因此调用此方法不会导致修改原始对象,这与使用名为set X mutate field X的方法的通常约定相反。相反,setScale返回一个具有适当比例的对象;返回的对象可能是新分配的,也可能不是新分配的。

舍入模式 共8种,常见的有以下7种:

1.1、ROUND_UP

从零舍入。始终在非零丢弃分数之前增加数字。

注意:这种舍入模式永远不会降低计算值的大小。

1.2、ROUND_DOWN

向零舍入。

  • 从不增加丢弃分数之前的数字(即截断)。

注意:这种舍入模式永远不会增加计算值的大小。

1.3、ROUND_HALF_UP

向“最近的邻居”舍入,除非两个邻居是等距的,在这种情况下向上舍入。

  • 如果丢弃的分数 ≥ 0.5,则与ROUND_UP一样;
  • 否则,行为与ROUND_DOWN相同;

注意:这是我们大多数人在小学时所教的舍入模式。

1.4、ROUND_HALF_DOWN

向“最近的邻居”舍入,除非两个邻居是等距的,在这种情况下向下舍入。

  • 如果丢弃的分数 > 0.5,则表现与ROUND_UP ;
  • 否则,行为与ROUND_DOWN相同。

1.5、ROUND_HALF_EVEN

向“最近的邻居”舍入,除非两个邻居是等距的,在这种情况下,向偶数邻居舍入。

  • 如果丢弃的分数左边的数字是奇数,则表现与ROUND_HALF_UP一样;
  • 如果它是偶数,则表现为ROUND_HALF_DOWN ;
  • BigDecimal.ROUND_HALF_EVEN 又称 银行家算法。

注意:​​​​​​​这是一种舍入模式,可在对一系列计算重复应用时最大限度地减少累积误差。

1.6、ROUND_CEILING

向正无穷大舍入。

  • 如果BigDecimal为正,则与ROUND_UP的行为相同;
  • 如果为负,则表现与ROUND_DOWN相同。

注意:此舍入模式永远不会减少计算值。

1.7、ROUND_FLOOR

向负无穷大舍入。

  • 如果BigDecimal为正,则表现与ROUND_DOWN一样;
  • 如果为负,则表现与ROUND_UP 。

注意:此舍入模式永远不会增加计算值。

2、舍入模式举例

2.1、保留3位小数

举例:保留 3位 小数
模式正数负数
3.14113.14153.1416-3.1411-3.1415-3.1416
ROUND_UP3.1423.1423.142-3.142-3.142-3.142
ROUND_DOWN3.1413.1413.141-3.141-3.141-3.141
ROUND_HALF_UP3.1413.1423.142-3.141-3.142-3.142
ROUND_HALF_DOWN3.1413.1413.142-3.141-3.141-3.142
ROUND_HALF_EVEN3.1413.1423.142-3.141-3.142-3.142
ROUND_CEILING3.1423.1423.142-3.141-3.141-3.141
ROUND_FLOOR3.1413.1413.141-3.142-3.142-3.142

2.2、保留1位小数

举例:保留 1位 小数
模式正数负数
3.14113.14153.1416-3.1411-3.1415-3.1416
ROUND_UP3.23.23.2-3.2-3.2-3.2
ROUND_DOWN3.13.13.1-3.1-3.1-3.1
ROUND_HALF_UP3.13.13.1-3.1-3.1-3.1
ROUND_HALF_DOWN3.13.13.1-3.1-3.1-3.1
ROUND_HALF_EVEN3.13.13.1-3.1-3.1-3.1
ROUND_CEILING3.23.23.2-3.1-3.1-3.1
ROUND_FLOOR3.13.13.1-3.2-3.2-3.2

2.3、保留0位小数

举例:保留 0位 小数
模式正数负数
3.14113.14153.1416-3.1411-3.1415-3.1416
ROUND_UP444-4-4-4
ROUND_DOWN333-3-3-3
ROUND_HALF_UP333-3-3-3
ROUND_HALF_DOWN333-3-3-3
ROUND_HALF_EVEN333-3-3-3
ROUND_CEILING444-3-3-3
ROUND_FLOOR333-4-4-4

3、应用场景分析

3.1、四舍五入

求近似数时。

  • 买菜买瓜:西瓜1元1斤,买的西瓜重10斤3两,收10元
  • 科学计数:所需要的电压、电流值,得分排名;

3.2、无条件进位

当涉及不可分事物,且不可舍事物时,用“进1法”。

如:运货、装油、坐船、坐车、求所需面积等。

  • 计算载货:有110人出行,每辆大巴最多可载53人,最少需要几辆大巴?  110÷53≈2.07=3(辆)
  • 计算容积:有32升水,最少需要几个5升桶才可装下?  32÷5≈6.4=7(个)

当涉及可分事物,(根据实际场景)向上进1位,并保留指定位置小数。

  • 收取费用:计算需收取支付费用1.122元,向上进1位并保留2位小数,则实际收取费用为1.13元。  积少成多,平台亏不起
  • 购物找零:小票显示10.45元,给收银员11元,找零0.5元。现在生活中很少有,无零钱可找

3.3、无条件舍位

当涉及不可分事物,且不可舍事物时,用“去尾法”。

如:做蛋糕、分东西、做衣服等。

  • 购买数量:小明有100元,每本词典15元,他最多能买几本词典?  100÷15≈6.67=6(本)
  • 制作件数:每件衣服要用布1. 2米,现有布料17.6米,可以做这样的衣服多少件?  17.6÷1.2≈14.67=14(件)

当涉及可分事物,(根据实际场景)截取指定位置小数,用“收尾法

  • 发放奖励:计算需奖励1.122元,截取并保留2位小数,则实际发放奖励为1.12元。  积少成多,平台亏不起

3.4、反向抹零

常见于酒店/餐厅、打出租车的结算账单,不过要提前告知 顾客并获得同意,否则属于侵权。

如 账单显示实际消费 110.5元,最终收到 111元,这就是反向抹零。

4、总结

以上是工作中的一些梳理,欢迎留言讨论……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狂龙骄子

独码乐,不如众码乐,乐享其中

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值