BIGDECIMAL 四舍五入等取舍问题

本文介绍了计算机中浮点数的表示方法及其在不同舍入方式下的运算结果,包括四舍五入、五舍六入等常用处理方式,并对比了正数与负数的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

我输入的是1.35,但是电脑不可能取到整数,他的值如下:
初始化数据:1.350000000000000088817841970012523233890533447265625
ROUND_DOWN); 1.35
ROUND_UP); 1.36
ROUND_CEILING); 1.36
ROUND_FLOOR); 1.35
ROUND_HALF_DOWN);1.35
ROUND_HALF_EVEN);1.35
ROUND_HALF_UP); 1.35

 

负数情况
初始化数据:-1.350000000000000088817841970012523233890533447265625
ROUND_DOWN); -1.35
ROUND_UP); -1.36
ROUND_CEILING); -1.35
ROUND_FLOOR); -1.36
ROUND_HALF_DOWN);-1.35
ROUND_HALF_EVEN);-1.35
ROUND_HALF_UP); -1.35

常用的

四舍五入用:ROUND_HALF_UP

五舍六入:ROUND_HALF_DOWN

向下取数用:ROUND_FLOOR

 

转载于:https://www.cnblogs.com/dzhou/p/9264474.html

在 Java 中,`BigDecimal` 类提供了一种精确表示十进制数的方式,并支持各种算术运算。如果需要将 `BigDecimal` 转换为 `Integer`,可以使用其内置方法 `intValue()` 或者更安全地结合其他操作(如取舍模式)完成。 以下是常见的几种方式: --- ### **1. 使用 intValue()** 这是最直接的方法,它会丢弃小数部分并返回整数值。 ```java BigDecimal bigDecimal = new BigDecimal("123.45"); int result = bigDecimal.intValue(); // 结果为 123 ``` 注意:此方法不会抛出异常,但如果数据有溢出风险,则可能导致结果不符合预期。 --- ### **2. 强制四舍五入后再转换** 为了避免精度丢失的问题,在转换前可以先对值进行四舍五入处理: ```java BigDecimal bigDecimal = new BigDecimal("123.78"); int result = bigDecimal.setScale(0, RoundingMode.HALF_UP).intValue(); // 结果为 124 ``` 这里我们通过 `setScale(0, RoundingMode.HALF_UP)` 指定保留零位小数点并将多余的部分按“半进一”规则去。 --- ### **3. 使用 toBigInteger().intValue()** 对于非常大的数字或者负指数情况下的 BigDecimal 值来说,这种方式更为稳健一些因为它首先尝试把该数值转成 BigInteger 对象然后再进一步转化为 int 形式。 ```java BigDecimal bigDecimal = new BigDecimal("99999999999"); int result = bigDecimal.toBigInteger().intValue(); // 需要注意可能发生的截断现象 ``` **注意事项**: 如果原始的大数超出了 Integer 的范围 [-2^31 到 (2^31)-1] ,那么最终的结果可能会被裁剪掉高位信息只留下低几位有效内容。 --- #### 示例完整代码片段 下面是一个完整的示例程序展示了上述三种技巧的应用场景: ```java public class Main { public static void main(String[] args) { BigDecimal decimalValue = new BigDecimal("123.6"); // 方案 1 - 简单 truncate 小数部分 System.out.println(decimalValue.intValue()); // 方案 2 - 四舍五入后获取 integer System.out.println(decimalValue.setScale(0,BigDecimal.ROUND_HALF_UP).intValue()); // 方案 3 - 先变更为 BigInteger 再缩小至 Int if (!decimalValue.scale()>0 && !decimalValue.compareTo(BigDecimal.ZERO)<0 ){ try{ System.out.println(decimalValue.toBigIntegerExact().intValue()); }catch(ArithmeticException e){ // 当无法准确表示为integer时触发错误 System.err.println(e.getMessage()); } } } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值