• 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、总结

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

  • 相关阅读:
    Jetpack Compose中的Constraint Layout
    BP神经网络的数据分类——语音特征信号分类
    避坑指南:小红书品牌投放易入的“七大坑”
    我的创作纪念日
    基于Java swing+mysql+eclipse的【图书管理系统】
    强化学习:价值迭代求解迷宫寻路问题
    学习MySQL的第三天:函数(基础篇)
    JZ23 链表中环的入口结点
    主要控制系统之间的逻辑关系
    轮到国产游戏统治Steam榜单
  • 原文地址:https://blog.csdn.net/Sn_Keys/article/details/126322985