- 由于需要处理精度比较高的浮点数,所以弃用double类型,改用BigDecimal类来进行数值处理。
-
- 在加减乘时都没有出现问题,但是到除法运算时,提示了如下错误:
-
- 大概的意思是“无法结束的除法表达式;没有精确的除结果”。我当时输入的10/3,结果应该是3.3333....333。
-
- 于是在网上找资料,发现我原来的处理方式有问题。
-
- BigDecimal num1 = new BigDecimal("10");
-
- BigDecimal num2 = new BigDecimal("3");
-
- BigDecimal num3 = num1.divide(num2);
-
- 其实devide的函数定义如下
-
- BigDecimal.divide(BigDecimal divisor, int scale, RoundingMode roundingMode) ;
-
- scale为小数位数;
-
- roundingMode为小数模式;
-
- ROUND_CEILING
-
- 如果 BigDecimal 是正的,则做 ROUND_UP 操作;如果为负,则做 ROUND_DOWN 操作。
-
- ROUND_DOWN
-
- 从不在舍弃(即截断)的小数之前增加数字。
-
- ROUND_FLOOR
-
- 如果 BigDecimal 为正,则作 ROUND_UP ;如果为负,则作 ROUND_DOWN 。
-
- ROUND_HALF_DOWN
-
- 若舍弃部分> .5,则作 ROUND_UP;否则,作 ROUND_DOWN 。
-
- ROUND_HALF_EVEN
-
- 如果舍弃部分左边的数字为奇数,则作 ROUND_HALF_UP ;如果它为偶数,则作 ROUND_HALF_DOWN 。
-
- ROUND_HALF_UP
-
- 若舍弃部分>=.5,则作 ROUND_UP ;否则,作 ROUND_DOWN 。
-
- ROUND_UNNECESSARY
-
- 该“伪舍入模式”实际是指明所要求的操作必须是精确的,,因此不需要舍入操作。
-
- ROUND_UP
-
- 总是在非 0 舍弃小数(即截断)之前增加数字。
-
- 写成如下便可通过
-
- BigDecimal num3 = num1.divide(num2,10,ROUND_HALF_DOWN);
转:http://blog.csdn.net/lopper/archive/2010/02/21/5314686.aspx
分享到:
相关推荐
* `divide(BigDecimal)`: 将两个 BigDecimal 对象的值相除,然后返回这个对象。 * `toString()`: 将 BigDecimal 对象的数值转换成字符串。 * `doubleValue()`: 将 BigDecimal 对象中的值以双精度数返回。 * `float...
6. 精确的除法运算:使用 BigDecimal 的 divide 方法可以进行精确的除法运算,例如将两个 BigDecimal 对象相除并返回结果。需要注意的是,除法运算可能会出现无限循环的小数,为了避免这种情况,可以使用 scale 参数...
在上面的代码中,使用 BigDecimal 对象 b1 和 b2 分别将 double 类型的 v1 和 v2 转换为 BigDecimal 对象,然后使用 divide 方法将两个 BigDecimal 对象相除,并将结果转换为 double 类型返回。 精度控制 在除法...
BigDecimal 相除 传入值乘100(一般用于rmb单位 元 转 分) 传入值除100 (一般用于rmb单位 分 转 元) 四舍五入保留两位小数 ( HALF_UP 5向上取,HALF_DOWN 5向下取) 舍弃指定位数后的小数 直接舍弃指定位数后的小数 ...
`safeDivide`方法用于进行除法运算,它可以将BigDecimal对象相除并返回结果。该方法可以用于计算单价、计算折扣等。 ```java public static <T extends Number> BigDecimal safeDivide(BigDecimal b1, BigDecimal ...
4. **divide(BigDecimal)** - 相除,可能需要指定精度和舍入模式,如 `divide(other, scale, RoundingMode.HALF_UP)`。 5. **toString()** - 返回 `BigDecimal` 的字符串表示形式。 6. **doubleValue()** - 转换为 `...
为了解决这个问题,Java提供了一个名为`BigDecimal`的类,它允许我们进行高精度的十进制数值计算。`BigDecimal`使用字符串表示法来存储和操作数值,从而避免了二进制浮点数的精度限制。以下是一些使用`BigDecimal`...
此外,还有取余运算符(模运算):`%`,用于获取两个数相除后的余数。 **3. 运算优先级** 运算符的优先级决定了计算的顺序。通常,乘法和除法的优先级高于加法和减法。可以使用括号来改变默认的运算顺序,例如: ``...
在Java中,取余操作符 `%` 用于获取两个数相除后的余数。例如,`i % 2` 返回 `i` 除以 `2` 的余数。对于正数来说,这个操作符的工作方式符合大多数人的直觉。然而,当涉及到负数时,情况就有所不同了。 **问题代码*...
- 取余运算符 `%` 计算两个整数相除后的余数。 - 在Java中,对于任意整数 `a` 和非零整数 `b`,存在恒等式 `(a / b) * b + (a % b) == a`。 - 当 `a` 为负数时,取余运算的结果也保持负号,即 `a % b` 与 `a` ...
为了应对浮点数运算可能出现的精度问题,Java提供了`java.math`包,其中包含了一些用于精确数学计算的类,比如`BigDecimal`。本文将深入探讨Java中常用的数学类以及如何进行精确的浮点数运算,包括加减乘除、四舍五...
使用`BigDecimal`类的关键在于避免直接从`double`转换到`BigDecimal`,因为`BigDecimal(double val)`构造器可能会引入同样的精度问题。正确的方法是先将`double`转换为`String`,然后再用`BigDecimal(String val)`...
总结来说,Java中的浮点数计算精度损失是由浮点数的二进制表示方式决定的,而要解决这个问题,最有效的方法是使用`BigDecimal`类进行高精度计算。在编程时,应根据实际需求选择合适的数值类型和计算策略,确保计算...
在SQL Server中,处理数值类型的数据时,特别是浮点数(float)或定点数(decimal, numeric),我们可能会遇到一个问题:当数值末尾有过多的零时,它们并不总是直观地显示出来。尤其是在进行计算或者存储后,这些零...
- JavaBigDecimal:利用Java提供的BigDecimal类来处理高精度的小数运算。 - 分数类:用于表示和运算分数数据类型。 2. 组合数学 - 组合数求模:包括朴素递推方法、逆元求解以及Lucas算法。 3. 概率论 - 概率论...
模运算符返回两个数相除后的余数。如果一个整数`i`除以2的余数为1,则该数为奇数。 **示例代码:** ```java public static boolean isOdd(int i) { return i % 2 == 1; } ``` 在这个例子中,如果输入的整数`i`...
在Java中,我们可以使用欧几里得算法实现这个功能,该算法基于两个数的除法性质,不断将较大的数替换为两数相除的余数,直到余数为零,此时较小的数即为最大公约数。 另一个可能的问题是计算斐波那契序列的第N项。...
在Java中,取余操作符(%)用于计算两个整数相除的余数。例如,`i % 2` 将会返回整数`i`除以2后得到的余数。但在处理负整数时,该操作符的返回值会保留与左侧操作数相同的符号。这意味着,对于负奇数,`i % 2`的结果...
2. 使用BigDecimal类:通过创建一个BigDecimal对象,然后使用setScale()方法对其进行保留小数位的操作。 double d = 114.145; BigDecimal b = new BigDecimal(d); d = b.setScale(2, BigDecimal.ROUND_HALF_UP)....