日常需求中,会有截取小数点后的数据。以下总结了两种方法:(推荐方法二,你懂的)
一、方法一:
该方法可以自定义保留小数点后N位,如果数值不满足自定义的位数,则用0补位。
/**
* @param str 需要截取的数字
* @param num 需要保留小数点后的位数
*/
public String cut(String str, int num) {
// 判断是整数还是小数,如果是整数,则小数点后用0补位
if (!str.contains(".")) {
String b = ".";
for (int a = 0; a < num; a++) {
b = b + "0";
}
return str + b;
}
// 获取小数点的位置
int index = str.indexOf(".");
String beforeNum = str.substring(0, index + 1);
// 获取小数点后面是否有num位,不足用0补位
String afterNum = str.replace(beforeNum, "");
// 判断小数点后位数是否大于保留的位数
if (afterNum.length() <= num) {
for (int a = afterNum.length(); a < num; a++) {
afterNum = afterNum + "0";
}
} else {
afterNum = afterNum.substring(0, num);
}
return beforeNum + afterNum;
}
结果:
二、方法二:(强烈推荐)
对精度要求较高的业务,推荐使用该方法。BigDecimal提供setScalefa(a,b)方法。
setScalefa(a,b)方法是用来设置BigDecimal对象的精度和舍入模式的。这个方法有两个参数,第一个参数是精度,即小数点后保留的位数;第二个参数是舍入模式,用来指定舍入规则。
BigDecimal的舍入模式:
-
UP(BigDecimal.ROUND_UP):远离零方向舍入。向远离0的方向舍入,也就是说,向绝对值最大的方向舍入,只要舍弃位非0即进位
-
DOWN(BigDecimal.ROUND_DOWN):趋向0方向舍入。向0方向靠拢,也就是说,向绝对值最小的方向输入,注意:所有的位都舍弃,不存在进位情况
-
CEILING(BigDecimal.ROUND_CEILING):向正无穷方向舍入。向正最大方向靠拢,如果是正数,舍入行为类似于ROUND_UP;如果为负数,则舍入行为类似于ROUND_DOWN.注意:Math.round方法使用的即为此模式
-
FLOOR(BigDecimal.ROUND_FLOOR):向负无穷方向舍入。向负无穷方向靠拢,如果是正数,则舍入行为类似ROUND_DOWN,如果是负数,舍入行为类似以ROUND_UP
-
HALF_UP(BigDecimal.ROUND_HALF_UP):最近数字舍入(5舍),这就是我们经典的四舍五入
-
HALF_DOWN(BigDecimal.ROUND_HALF_DOWN):最近数字舍入(5舍)。在四舍五入中,5是进位的,在HALF_DOWN中却是舍弃不进位
-
HALF_EVEN(BigDecimal.ROUND_HALF_EVEN):银行家算法。四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一。见最后详解
-
UNNECESSARY(BigDecimal.ROUND_UNNECESSARY):断言请求的操作具有精确的结果,因此不需要舍入。如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException
/**
* @param str 需要截取的数字
* @param num 需要保留小数点后的位数
*/
public BigDecimal cut(String str, int num) {
BigDecimal bd = new BigDecimal(str);
// 保留num位小数(四舍五入)
bd = bd.setScale(num, RoundingMode.HALF_UP);
return bd;
}
结果:
三、方法三(MySQL:ROUND( X , D)函数)
表结构:
SQL语句:
SELECT
ROUND( salary, 2 )
FROM
salary
ROUND(X,D) 返回最接近于参数 X 的整数;ROUND( X , D) 函数对参数 X 进行四舍五入的操作,返回值保留小数点后面指定的 D 位。
D 默认是 0 ,即 ROUND( X )等同于 ROUND( , D) 。D 也可是负数,指定小数点左边的d位整数位为 0, 同时小数位均为 0。
如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、评论、收藏➕关注,您的支持是我坚持写作最大的动力。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/161440.html