BigDecimal 舍入模式
BigDecimal Rounding modes
我们正在将一些 sybase 代码替换为 Java,并且在舍入 BigDecimal 以匹配 sybase returns
时遇到问题
11.44439999999999999062083588796667754650115966796875 - 应该 return 11.44
和
35.95499999999999982946974341757595539093017578125 - 应该 return 35.96
我已经尝试了所有不同的舍入选项并将比例设置为 2,但 none 对两者都有效。什么是最佳选择?
此解决方案效率不高,但可以完成工作。
源代码
import java.math.BigDecimal;
public class BigDecimalRound {
public static void main(String[] args) {
BigDecimal bd;
float f;
bd = new BigDecimal(11.4443999999999999062083588796667754650115966796875);
f = roundBigDecimal(bd, 2);
System.out.println("bd: " + bd + ", f: " + f);
bd = new BigDecimal(35.9549999999999982946974341757595539093017578125);
f = roundBigDecimal(bd, 2);
System.out.println("bd: " + bd + ", f: " + f);
}
public static float roundBigDecimal(BigDecimal bd, int precision) {
int i = (int) Math.pow(10, precision);
return (float) Math.round(bd.floatValue() * i) / i;
}
}
输出
bd: 11.4443999999999999062083588796667754650115966796875, f: 11.44
bd: 35.9549999999999982946974341757595539093017578125, f: 35.96
您必须分两步走。第一轮到规模 3,然后到规模 2,使用 RoundingMode.HALF_UP
:
BigDecimal value1 = new BigDecimal("11.4443999999999999062083588796667754650115966796875");
BigDecimal value2 = new BigDecimal("35.9549999999999982946974341757595539093017578125");
BigDecimal rounded1 = value1.setScale(3, RoundingMode.HALF_UP); // 11.444
rounded1 = rounded1.setScale(2, RoundingMode.HALF_UP); // 11.44
BigDecimal rounded2 = value2.setScale(3, RoundingMode.HALF_UP); // 35.955
rounded2 = rounded2.setScale(2, RoundingMode.HALF_UP); // 35.96
我们正在将一些 sybase 代码替换为 Java,并且在舍入 BigDecimal 以匹配 sybase returns
时遇到问题11.44439999999999999062083588796667754650115966796875 - 应该 return 11.44
和
35.95499999999999982946974341757595539093017578125 - 应该 return 35.96
我已经尝试了所有不同的舍入选项并将比例设置为 2,但 none 对两者都有效。什么是最佳选择?
此解决方案效率不高,但可以完成工作。
源代码
import java.math.BigDecimal;
public class BigDecimalRound {
public static void main(String[] args) {
BigDecimal bd;
float f;
bd = new BigDecimal(11.4443999999999999062083588796667754650115966796875);
f = roundBigDecimal(bd, 2);
System.out.println("bd: " + bd + ", f: " + f);
bd = new BigDecimal(35.9549999999999982946974341757595539093017578125);
f = roundBigDecimal(bd, 2);
System.out.println("bd: " + bd + ", f: " + f);
}
public static float roundBigDecimal(BigDecimal bd, int precision) {
int i = (int) Math.pow(10, precision);
return (float) Math.round(bd.floatValue() * i) / i;
}
}
输出
bd: 11.4443999999999999062083588796667754650115966796875, f: 11.44 bd: 35.9549999999999982946974341757595539093017578125, f: 35.96
您必须分两步走。第一轮到规模 3,然后到规模 2,使用 RoundingMode.HALF_UP
:
BigDecimal value1 = new BigDecimal("11.4443999999999999062083588796667754650115966796875");
BigDecimal value2 = new BigDecimal("35.9549999999999982946974341757595539093017578125");
BigDecimal rounded1 = value1.setScale(3, RoundingMode.HALF_UP); // 11.444
rounded1 = rounded1.setScale(2, RoundingMode.HALF_UP); // 11.44
BigDecimal rounded2 = value2.setScale(3, RoundingMode.HALF_UP); // 35.955
rounded2 = rounded2.setScale(2, RoundingMode.HALF_UP); // 35.96