-
传统的四舍五入BigDecimal类,BUG?20
想要一个跟我们传统学的四舍五入的方法,网上多说下面的方法可以用,我测了下,发现有很多问题啊。当所要求的小数位小于等于1位时没错误,但当小数位2位以上就有问题了,下面是测试用例,及结果。测试发现当所要小数位为2位时,遇到偶数进1,奇数不进。十位数不位空时也是如此。 谁说下这个啥回事?顺便求其他传统格式化方法。DecimalFormat这个类也不行,奇数进1偶数不进的public class test { public static void main(String[] args) { double a = 1.5; double b = 2.5; double c = 1.35; double d = 2.35; double e = 2.355; double f = 2.345; double g= 12.35; BigDecimal bigA =new BigDecimal(a).setScale(0, BigDecimal.ROUND_HALF_UP); BigDecimal bigB =new BigDecimal(b).setScale(0, BigDecimal.ROUND_HALF_UP); BigDecimal bigC =new BigDecimal(c).setScale(1, BigDecimal.ROUND_HALF_UP); BigDecimal bigD =new BigDecimal(d).setScale(1, BigDecimal.ROUND_HALF_UP); BigDecimal bigE=new BigDecimal(e).setScale(2, BigDecimal.ROUND_HALF_UP); BigDecimal bigF=new BigDecimal(f).setScale(2, BigDecimal.ROUND_HALF_UP); BigDecimal bigG=new BigDecimal(g).setScale(1, BigDecimal.ROUND_HALF_UP); System.out.println("test A:"+bigA.doubleValue()); System.out.println("test B:"+bigB.doubleValue()); System.out.println("test C:"+bigC.doubleValue()); System.out.println("test D:"+bigD.doubleValue()); System.out.println("test E:"+bigE.doubleValue()); System.out.println("test F:"+bigF.doubleValue()); System.out.println("test G:"+bigG.doubleValue()); } }
输出结果: 想要的结果
test A:2.0 2.0
test B:3.0 3.0
test C:1.4 1.4
test D:2.4 2.4
test E:2.35 X 2.36
test F:2.35 2.35
test G:12.3 X 12.42010年10月13日 14:59
3个答案 按时间排序 按投票排序
-
采纳的答案
你定义的方式有问题。
double g= 12.35; 定义了一个g=12.34444444444444449,假如是这个数
new BigDecimal(g) g还是12.34444444444444449
new BigDecimal(g).setScale(1, BigDecimal.ROUND_HALF_UP); 12.34
正确的定义方式是使用字符串构造函数
new BigDecimal("12.35").setScale(1, BigDecimal.ROUND_HALF_UP)2010年10月13日 15:24
-
public static double round(double value,int scale){
if(scale<0){
throw new IllegalArgumentException(
The scale must be a positive integer or zero");
}
BigDecimal b = new BigDecimal(Double.toString(value));
BigDecimal one = new BigDecimal("1");
return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
试试上面的方法吧!!!2010年10月13日 16:34
相关推荐
在 Java 语言中,四舍五入方法可以通过多种方式实现,包括使用 Math 类的方法、DecimalFormat 类的方法和 BigDecimal 类的方法。 1. 使用 Math 类的方法 Java 的 Math 类提供了多种数学函数,包括 floor、ceil 和 ...
在这个场景中,标题"四舍五入_四舍五入问题_源码"暗示我们将讨论如何在编程中实现四舍五入操作,特别是与计算苹果单价和数量相关的总价问题。描述提到“输入苹果的单价及购买的数量,计算总价,分别显示总价的总价...
在Java中,四舍五入可以通过多种方式实现,包括使用`Math`类中的方法以及`BigDecimal`类。 ### 使用Math类进行四舍五入 `Math`类是Java标准库的一部分,提供了多种数学函数,包括`floor()`和`ceil()`。这两个方法...
在上面的例子中,我们使用`BigDecimal`类创建了一个表示123.4567的`BigDecimal`对象,然后调用`setScale()`方法设置保留两位小数,并使用`RoundingMode.HALF_EVEN`指定四舍五入的规则。 ##### 2. 使用 `...
在Java中,`BigDecimal`类是用来处理大数值和高精度计算的,同样适用于四舍五入: ```java BigDecimal bd = new BigDecimal("12345.6789"); BigDecimal rounded = bd.setScale(2, RoundingMode.HALF_UP); System....
Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE...
BigDecimal 类提供了四种构造器,用于创建不同的 BigDecimal 对象: * `BigDecimal(int)`: 创建一个具有参数所指定整数值的对象。 * `BigDecimal(double)`: 创建一个具有参数所指定双精度值的对象。 * `BigDecimal...
标题 "sishewuru.rar_四舍五入" 暗示了我们关注的主题是关于数值计算中的四舍五入操作。在这个主题下,我们将深入探讨四舍五入的定义、用途、方法以及在编程中实现四舍五入的常见算法。 四舍五入是一种在数学和...
2. **`BigDecimal`类**: `BigDecimal`是Java中用于处理精确浮点数的类,它提供了丰富的四舍五入方法,如`round(RoundingMode mode)`。`RoundingMode`枚举定义了多种舍入策略,如`UP`(向远离零的方向取整)、`DOWN`...
保留位可以使用BigDecimal类来实现,BigDecimal类提供了多种舍入规则,包括银行家舍入法、普通四舍五入规则等。 在银行家舍入法中,如果舍去位的数值小于5时,直接舍去;舍去位的数值大于5时,进位后舍去;当舍去位...
BigDecimal类提供了多种四舍五入的方法,如`setScale(int newScale, RoundingMode roundingMode)`。这个方法可以用来改变BigDecimal的标度(即小数位数),并指定四舍五入的策略。`newScale`参数指定了新的小数位数...
图文并茂吃透面试题,看完这个,吊打面试官,拿高薪offer!
BigDecimal工具类 BigDecimal工具类是Java中用于高精确处理常用数学运算的工具类。该工具类提供了多种精确的数学运算方法,包括加法、减法、乘法和除法等。 在BigDecimal工具类中,我们可以看到多个重载的方法,...
此外,BigDecimal类还支持舍入模式(RoundingMode),在进行除法运算时,如果需要四舍五入或者按照特定规则处理余数,可以通过setScale(int newScale, RoundingMode roundingMode)方法来实现。总之,Java中的...
4. **舍入模式**:在执行除法运算时,`BigDecimal`提供了多种舍入模式,如`ROUND_UP`, `ROUND_DOWN`, `ROUND_HALF_EVEN`等,以决定结果如何处理超出精度的数字。 5. **不可变性**:同样,`BigDecimal`对象也是不可...
2. **舍入模式**: `BigDecimal.ROUND_HALF_UP` 表示四舍五入模式,这是最常见的舍入方式。`BigDecimal` 还提供了其他多种舍入模式,如 `ROUND_DOWN`、`ROUND_UP` 等,可以根据具体需求选择。 3. **异常处理**: 当 `...
这里 `20` 表示保留20位小数,`ROUND_HALF_UP` 是舍入模式,表示四舍五入。 6. 舍入模式(RoundingMode): BigDecimal 支持八种舍入模式,如: - ROUND_UP:向上舍入,远离零,始终增加数字。 - ROUND_DOWN:...
否则采用四舍五入的方式。这里使用了 `setScale` 方法来控制结果的精度和舍入方式。 接下来是几个具体的计算例子: - **预算资本支付成本** (`budgetCapitalPayCost`):首先获取所有预算资本支付成本 (`...
alert(new BigDecimal("10").add(new BigDecimal("3E+10"))); //- alert(new BigDecimal("10").subtract(new BigDecimal("3E+10"))); //* alert(new BigDecimal("10").multiply(new BigDecimal("3E+10"))); // / ...
`BigDecimal`是Java中处理高精度、大范围数值的一个类,它提供了丰富的算术运算方法,包括四舍五入。以下是使用`BigDecimal`进行四舍五入的例子: ```java double f = 3.1516; BigDecimal b = new BigDecimal(f); ...