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小,则四舍五入后得到的数字比原数字要小
既3.523 保留两位小数,四舍五入后得到3.52
-3.523 保留两位小数,四舍五入后得到-3.53
如果后一位比4大。也就是>=5,那么四舍五入后得到的数字就比原来的大。
既3.235 保留两位小数,四舍五入后得到3.24
-3.235 保留两位小数,四舍五入后得到-3.22
#4
有这种逻辑吗?表示疑惑
#5
樓主覺得四捨五入 放到負數裡面叫 四入五舍
覺得舍一定是往小的地方走 入一定是令數字變大
覺得舍一定是往小的地方走 入一定是令數字變大
#6
是的 我是这样认为的
是我想错了?还请你给我解释一下
#7
难道负数没四舍五入的概念?或者不是这样理解的
#8
#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小,则四舍五入后得到的数字比原数字要小
既3.523 保留两位小数,四舍五入后得到3.52
-3.523 保留两位小数,四舍五入后得到-3.53
如果后一位比4大。也就是>=5,那么四舍五入后得到的数字就比原来的大。
既3.235 保留两位小数,四舍五入后得到3.24
-3.235 保留两位小数,四舍五入后得到-3.22
#4
有这种逻辑吗?表示疑惑
#5
樓主覺得四捨五入 放到負數裡面叫 四入五舍
覺得舍一定是往小的地方走 入一定是令數字變大
覺得舍一定是往小的地方走 入一定是令數字變大
#6
是的 我是这样认为的
是我想错了?还请你给我解释一下
#7
难道负数没四舍五入的概念?或者不是这样理解的
#8
#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
谢谢各位的回答,
确实是我对四舍五入的逻辑理解错了
马上结贴
确实是我对四舍五入的逻辑理解错了
马上结贴