BigDecimal数据类型 四舍五入的疑惑,在线等!~~急!!!

时间:2021-02-06 09:45:29
到网上找的资料
BigDecimal.ROUND_HALF_UP 表示如果最后一位<5 则舍弃,如果>=5, 向前进一位。反之舍弃

测试后

public static void main(String args[]) {
BigDecimal  a = new BigDecimal ("1.8256");
         BigDecimal  b = new BigDecimal ("1.8226");
         System.out.println(a.setScale(2, BigDecimal.ROUND_HALF_UP));
         System.out.println("b="+b.setScale(2, BigDecimal.ROUND_HALF_UP));
}

输出:a=1.83
      b=1.82
实现了我要的效果。
但是如果操作的是负数,那该怎么办?下面这方法显然不行


public static void main(String args[]) {
BigDecimal  c = new BigDecimal ("1.8256");
BigDecimal  d = new BigDecimal ("1.8226");
c = c.negate();
d = d.negate();
System.out.println("c="+c.setScale(2, BigDecimal.ROUND_HALF_UP));
System.out.println("d="+d.setScale(2, BigDecimal.ROUND_HALF_UP));}

输出:c=-1.83
      d=-1.82

13 个解决方案

#1


为什么不行?
负数同样呀

#2


那你希望负数得到什么样的结果?

#3


保留的小数位
如果后一位比4小,则四舍五入后得到的数字比原数字要小
既3.523 保留两位小数,四舍五入后得到3.52
-3.523  保留两位小数,四舍五入后得到-3.53
如果后一位比4大。也就是>=5,那么四舍五入后得到的数字就比原来的大。
既3.235 保留两位小数,四舍五入后得到3.24
-3.235  保留两位小数,四舍五入后得到-3.22

#4


有这种逻辑吗?表示疑惑

#5


樓主覺得四捨五入  放到負數裡面叫  四入五舍
覺得舍一定是往小的地方走  入一定是令數字變大

#6


引用 5 楼 daocha 的回复:
樓主覺得四捨五入 放到負數裡面叫 四入五舍
覺得舍一定是往小的地方走 入一定是令數字變大


是的  我是这样认为的

是我想错了?还请你给我解释一下

#7


难道负数没四舍五入的概念?或者不是这样理解的

#8


BigDecimal数据类型 四舍五入的疑惑,在线等!~~急!!!
BigDecimal数据类型 四舍五入的疑惑,在线等!~~急!!!

#9


要是你的需求是这样。你看看能不能满足。或者自己改改

public static void main(String[] args) {
System.out.println(getRundDouble("-3.523"));
System.out.println(getRundDouble("3.523"));
System.out.println(getRundDouble("3.235"));
System.out.println(getRundDouble("-3.235"));
    }

public static double getRundDouble(String value){
 BigDecimal  c = new BigDecimal (value);
 if(c.doubleValue()>0){
 return c.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue();
 }else{
 String str=String.valueOf(value);
 String[] array=str.split("\\.");
 if(array.length==1){
 return c.setScale(2).doubleValue(); 
 }else{
 if(array[1].length()<=2){
 return c.setScale(2).doubleValue(); 
 }else{
 char[] chars=array[1].toCharArray();
 int[] ints=new int[chars.length];
 for(int i=0;i<chars.length;i++){
 ints[i]=Integer.valueOf(String.valueOf(chars[i]));
 }
 if(ints[2]>=5){
 return Double.valueOf(array[0]+"."+ints[0]+(ints[1]-1));
 }else{
 return Double.valueOf(array[0]+"."+ints[0]+(ints[1]+1));
 }
 }
 }
 }

}

#10


四舍五入通常的概念是接近哪个算哪个 5的话两边一样接近 按惯例 算大的
负数为什么要有例外呢? 如果是自己的特殊业务,实现之即可

#11


重新写下

public static double getRundDouble(String value) {
BigDecimal c = new BigDecimal(value);
if (c.doubleValue() > 0) {
return c.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
} else {
String[] array = value.split("\\.");
if (array.length == 1) {
return c.setScale(2).doubleValue();
} else {
if (array[1].length() <= 2) {
return c.setScale(2).doubleValue();
} else {
String[] strs = array[1].split("(?<!^)(?=\\d)");
if (Integer.valueOf(strs[2]) >= 5) {
return Double.valueOf(array[0] + "." + strs[0]
+ (Integer.valueOf(strs[1]) - 1));
} else {
return Double.valueOf(array[0] + "." + strs[0]
+ (Integer.valueOf(strs[1]) + 1));
}
}
}
}
}

#12


感觉楼主逻辑错了=。=

#13


谢谢各位的回答,
确实是我对四舍五入的逻辑理解错了
马上结贴

#1


为什么不行?
负数同样呀

#2


那你希望负数得到什么样的结果?

#3


保留的小数位
如果后一位比4小,则四舍五入后得到的数字比原数字要小
既3.523 保留两位小数,四舍五入后得到3.52
-3.523  保留两位小数,四舍五入后得到-3.53
如果后一位比4大。也就是>=5,那么四舍五入后得到的数字就比原来的大。
既3.235 保留两位小数,四舍五入后得到3.24
-3.235  保留两位小数,四舍五入后得到-3.22

#4


有这种逻辑吗?表示疑惑

#5


樓主覺得四捨五入  放到負數裡面叫  四入五舍
覺得舍一定是往小的地方走  入一定是令數字變大

#6


引用 5 楼 daocha 的回复:
樓主覺得四捨五入 放到負數裡面叫 四入五舍
覺得舍一定是往小的地方走 入一定是令數字變大


是的  我是这样认为的

是我想错了?还请你给我解释一下

#7


难道负数没四舍五入的概念?或者不是这样理解的

#8


BigDecimal数据类型 四舍五入的疑惑,在线等!~~急!!!
BigDecimal数据类型 四舍五入的疑惑,在线等!~~急!!!

#9


要是你的需求是这样。你看看能不能满足。或者自己改改

public static void main(String[] args) {
System.out.println(getRundDouble("-3.523"));
System.out.println(getRundDouble("3.523"));
System.out.println(getRundDouble("3.235"));
System.out.println(getRundDouble("-3.235"));
    }

public static double getRundDouble(String value){
 BigDecimal  c = new BigDecimal (value);
 if(c.doubleValue()>0){
 return c.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue();
 }else{
 String str=String.valueOf(value);
 String[] array=str.split("\\.");
 if(array.length==1){
 return c.setScale(2).doubleValue(); 
 }else{
 if(array[1].length()<=2){
 return c.setScale(2).doubleValue(); 
 }else{
 char[] chars=array[1].toCharArray();
 int[] ints=new int[chars.length];
 for(int i=0;i<chars.length;i++){
 ints[i]=Integer.valueOf(String.valueOf(chars[i]));
 }
 if(ints[2]>=5){
 return Double.valueOf(array[0]+"."+ints[0]+(ints[1]-1));
 }else{
 return Double.valueOf(array[0]+"."+ints[0]+(ints[1]+1));
 }
 }
 }
 }

}

#10


四舍五入通常的概念是接近哪个算哪个 5的话两边一样接近 按惯例 算大的
负数为什么要有例外呢? 如果是自己的特殊业务,实现之即可

#11


重新写下

public static double getRundDouble(String value) {
BigDecimal c = new BigDecimal(value);
if (c.doubleValue() > 0) {
return c.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
} else {
String[] array = value.split("\\.");
if (array.length == 1) {
return c.setScale(2).doubleValue();
} else {
if (array[1].length() <= 2) {
return c.setScale(2).doubleValue();
} else {
String[] strs = array[1].split("(?<!^)(?=\\d)");
if (Integer.valueOf(strs[2]) >= 5) {
return Double.valueOf(array[0] + "." + strs[0]
+ (Integer.valueOf(strs[1]) - 1));
} else {
return Double.valueOf(array[0] + "." + strs[0]
+ (Integer.valueOf(strs[1]) + 1));
}
}
}
}
}

#12


感觉楼主逻辑错了=。=

#13


谢谢各位的回答,
确实是我对四舍五入的逻辑理解错了
马上结贴