Java中的四舍五入

Math类中有这样两个方法:

1	public static long round(double a)
2	public static int round(float a)
方法1返回最接近参数的long,其结果相当于下面这个表达式的值:
(long)Math.floor(a + 0.5d)

方法2返回最接近参数的int,其结果相当于下面这个表达式的值:

(int)Math.floor(a + 0.5f)


这其实就是四舍五入了,只不过它们只保留整数位。
示例:

long aL = Math.round(0.4d);
long bL = Math.round(0.5d); 
int cI = Math.round(0.4f);
int dI = Math.round(0.5f);
System.out.println("aL = " + aL);
System.out.println("bL = " + bL);
System.out.println("cI = " + cI);
System.out.println("dI = " + dI);
输出结果:
aL = 0
bL = 1
cI = 0
dI = 1

下面,我们利用方法1返来实现自己的四舍五入方法,使它对不同的精度提供支持。
public static double myRound(double d, int n) {
// 分别以A:d = 0.514d, n = 1和B:d = 0.514d, n = 2为例进行分析
d = d * Math.pow(10, n);
// A: 0.514 * 10 -> 5.14
// B: 0.514 * 100 -> 51.4
d += 0.5d;
// A: 5.14 + 0.5 -> 5.64
// B: 51.4 + 0.5 -> 51.9
d = (long)d;
// A: (long)5.64 -> 5
// B: (long)51.9 -> 51
d = d / Math.pow(10d, n);
// A: 5 / 10d -> 0.5
// B: 51 / 100d -> 0.51
return d;
// 合起来写
// return (long)(d * Math.pow(10d, n) + 0.5d) / Math.pow(10d, n);
}
下面对这个方法进行测试:
System.out.println("myRound(916.254, -3) = " + myRound(916.254, -3));
System.out.println("myRound(916.254, -2) = " + myRound(916.254, -2));
System.out.println("myRound(916.254, -1) = " + myRound(916.254, -1));
System.out.println("myRound(916.254, 0) = " + myRound(916.254, 0));
System.out.println("myRound(916.254, 1) = " + myRound(916.254, 1));
System.out.println("myRound(916.254, 2) = " + myRound(916.254, 2));
System.out.println("myRound(916.254, 3) = " + myRound(916.254, 3));
输出结果:
myRound(916.254, -3) = 1000.0
myRound(916.254, -2) = 900.0
myRound(916.254, -1) = 920.0
myRound(916.254, 0) = 916.0
myRound(916.254, 1) = 916.3
myRound(916.254, 2) = 916.25
myRound(916.254, 3) = 916.254

我们的目标基本上实现了。但是,仔细观察,当n <= 0的时候,打印出来的结果不是我们想要的那样,小数点后的那个0是没有意义的。这是因为myRound方法返回的值是double类型。重要的是数据,格式是第二位的。如果要对数据的输出格式进行比较精确的控制,可以使用PrintStream类的这个方法:

public PrintStream printf(String format, Object... args) 

从方法名printf就可以猜出它和C的printf函数之间的关系。
如果想让920.0显示为920,可以这样写:
System.out.printf("%.0f", 920.0);
但如果想让920.5显示为920,用上面的方法是不行的。
System.out.printf("%.0f", 920.5);
这条语句会输出921,而不是920。
其实,Java类库已经提供了四舍五入的方法,只不过比较隐蔽,当然它的功能也更强大。在java.math包中有一个BigDecimal类,这个类有这样一个方法:
public BigDecimal divide(BigDecimal divisor,
            int scale,
RoundingMode roundingMode)
这个方法其实是做大数的除法,其中的divisor就是除数,要做四舍五入,我们为divisor传入new BigDecimal(1),scale就是商的标度(精度),如果我们要保留两位小数,就为scale传入2,roundingMode是舍入模式,除四舍五入以外,Java还提供了好几种其它的舍入模式,而我们要做四舍五入,为它传入RoundingMode.HALF_UP。
示例:
System.out.println(new BigDecimal(916.254).divide(new BigDecimal(1), -3, RoundingMode.HALF_UP));
System.out.println(new BigDecimal(916.254).divide(new BigDecimal(1), -2, RoundingMode.HALF_UP));
System.out.println(new BigDecimal(916.254).divide(new BigDecimal(1), -1, RoundingMode.HALF_UP));
System.out.println(new BigDecimal(916.254).divide(new BigDecimal(1), -0, RoundingMode.HALF_UP));
System.out.println(new BigDecimal(916.254).divide(new BigDecimal(1), 1, RoundingMode.HALF_UP));
System.out.println(new BigDecimal(916.254).divide(new BigDecimal(1), 2, RoundingMode.HALF_UP));
System.out.println(new BigDecimal(916.254).divide(new BigDecimal(1), 3, RoundingMode.HALF_UP));
输出结果:
1E+3
9E+2
9.2E+2
916
916.3
916.25
916.254
需要注意的是,这个方法返回的是一个bigDecimal对象,要把它转成double或int,使用下面的方法:
public double doubleValue()
public int intValue()


本文出自 “中强” 博客,请务必保留此出处http://htgylzhq.blog.51cto.com/1602429/795550






### Java 实现四舍五入的方法 在 Java 编程语言,有多种方式可以实现数值的四舍五入操作。以下是几种常见的方式及其具体实现: #### 1. **使用 `Math.round()` 方法** `Math.round()` 是一种简单且高效的方式来对浮点数进行四舍五入处理。该方法会将浮点数转换为最近的整数值[^1]。 对于正数和负数的情况,其行为如下: - 正数:当小数部分大于等于 0.5 时向上取整;小于 0.5 则向下取整。 - 负数:遵循类似的规则,但需要注意边界情况(如 `-10.5` 的结果仍为 `-10`)。 示例代码如下: ```java public class MathRoundExample { public static void main(String[] args) { System.out.println(Math.round(10.4)); // 输出: 10 System.out.println(Math.round(10.5)); // 输出: 11 System.out.println(Math.round(-10.4)); // 输出: -10 System.out.println(Math.round(-10.5)); // 输出: -10 } } ``` 如果需要保留指定的小数位数,则可以通过调整数值大小来间接完成此目标[^2]。例如: ```java public class DecimalRounding { public static void main(String[] args) { double num = 3.14159; int decimalPlaces = 2; // 需要保留的小数位数 double roundedNum = Math.round(num * Math.pow(10, decimalPlaces)) / Math.pow(10, decimalPlaces); System.out.println(roundedNum); // 输出: 3.14 } } ``` --- #### 2. **利用 `BigDecimal` 类** `BigDecimal` 提供了一种更灵活且精确的方式来控制数值的舍入模式。通过设置不同的舍入策略,开发者可以根据需求自定义四舍五入的行为[^3]。 下面是一个基于 `BigDecimal` 实现四舍五入的例子: ```java import java.math.BigDecimal; public class BigDecimalExample { public static void main(String[] args) { BigDecimal bd = new BigDecimal("-2.5"); BigDecimal roundedValue = bd.setScale(0, BigDecimal.ROUND_HALF_UP); System.out.println("四舍五入后的值:" + roundedValue.toString()); // 输出: -2 } } ``` 在此例子,`setScale(int scale, RoundingMode mode)` 方法用于指定保留的有效位数以及采用何种舍入算法。其 `ROUND_HALF_UP` 表示标准意义上的四舍五入逻辑。 --- #### 3. **借助字符串格式化工具 (`String.format`)** 除了上述两种技术外,还可以运用 `String.format` 函数快速生成经过四舍五入处理过的字符串表示形式的数据[^4]。这种方式特别适合于仅需展示最终结果而无需进一步计算的情形下应用。 实例演示如下所示: ```java public class FormatExample { public static void main(String[] args) { double num = 3.1415926; String formattedResult = String.format("%.4f", num); System.out.println(formattedResult); // 输出: 3.1416 } } ``` 这里 `%.<precision>f` 占位符的 `<precision>` 定义了期望保留的小数点后几位数字长度。 --- ### 总结 综上所述,在实际开发过程可根据具体情况选择合适的方案来进行数据的四舍五入运算。每种方法都有各自的适用场景与优缺点,合理选用能够有效提升程序性能并满足业务需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值