之前碰到一个java四舍五入的问题,这个问题一直没有找到好的答案,今天总算弄明白了。
问题如下:
double f1 = new BigDecimal(0.00251231212).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue();
或者
double f1 = new BigDecimal(“0.00251231212”).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue();
f1的输出结果是:0.0030
请问为什么不是0.003?有什么办法使其返回的结果是0.003?
回答:当输出f1的时候,print方法会调用String.valueof(Double x), 实际上都是转成string了,所以理论上不是string的对象,打印都要格式化,除非你不在乎。
可以如此格式化:
System.out.println(MessageFormat.format("{0,number,#.###}",f1));
精度问题可以运行如下代码:
double val = 0;
for (int i = 0; i < 10; i++) {
val += 0.1;
System.out.println(val);
}
问题如下:
double f1 = new BigDecimal(0.00251231212).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue();
或者
double f1 = new BigDecimal(“0.00251231212”).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue();
f1的输出结果是:0.0030
请问为什么不是0.003?有什么办法使其返回的结果是0.003?
回答:当输出f1的时候,print方法会调用String.valueof(Double x), 实际上都是转成string了,所以理论上不是string的对象,打印都要格式化,除非你不在乎。
可以如此格式化:
System.out.println(MessageFormat.format("{0,number,#.###}",f1));
精度问题可以运行如下代码:
double val = 0;
for (int i = 0; i < 10; i++) {
val += 0.1;
System.out.println(val);
}
BigDecimal feeAmountBigDecimal = new BigDecimal("17.83");
BigDecimal unitBigDecimal = new BigDecimal("100");
BigDecimal amount = feeAmountBigDecimal.multiply(unitBigDecimal);
//whose scale is {@code (this.scale() + multiplicand.scale())}
System.out.println(amount); //1783.00
System.out.println(17.83*100); //1782.9999999999998