如果值为200.3456,则应该将其格式化为200.34。 如果它是200,那么它应该是200.00。
当前回答
function Double round2(Double val) {
return new BigDecimal(val.toString()).setScale(2,RoundingMode.HALF_UP).doubleValue();
}
注意toString()!!!!
这是因为BigDecimal转换double的精确二进制形式!!
这些是各种建议的方法及其失败的情况。
// Always Good!
new BigDecimal(val.toString()).setScale(2,RoundingMode.HALF_UP).doubleValue()
Double val = 260.775d; //EXPECTED 260.78
260.77 - WRONG - new BigDecimal(val).setScale(2,RoundingMode.HALF_UP).doubleValue()
Double val = 260.775d; //EXPECTED 260.78
260.77 - TRY AGAIN - Math.round(val * 100.d) / 100.0d
Double val = 256.025d; //EXPECTED 256.03d
256.02 - OOPS - new DecimalFormat("0.00").format(val)
// By default use half even, works if you change mode to half_up
Double val = 256.025d; //EXPECTED 256.03d
256.02 - FAIL - (int)(val * 100 + 0.5) / 100.0;
其他回答
double value= 200.3456;
DecimalFormat df = new DecimalFormat("0.00");
System.out.println(df.format(value));
例如,如果你真的想要相同的双精度,但以你想要的方式四舍五入,你可以使用BigDecimal
new BigDecimal(myValue).setScale(2, RoundingMode.HALF_UP).doubleValue();
四舍五入通常不是一个人想要的。相反,应该使用String.format()以所需的格式表示它。
最简单的方法,就是做一个这样的魔术;
double val = ....;
val = val*100;
val = Math.round(val);
val = val /100;
如果val从200.3456开始,那么它会变成20034.56,然后四舍五入到20035,然后我们除以它得到200.34。
如果你想总是四舍五入,我们可以通过转换为int型来截断:
double val = ....;
val = val*100;
val = (double)((int) val);
val = val /100;
这种技术适用于大多数情况,因为对于非常大的double(正的或负的),它可能会溢出。但如果你知道你的值将在一个适当的范围内,那么这应该对你有用。
请使用Apache通用数学:
Precision.round(10.4567, 2)
推荐文章
- Eclipse调试器总是阻塞在ThreadPoolExecutor上,没有任何明显的异常,为什么?
- Java生成两个给定值之间的随机数
- 如何有效地从数组列表或字符串数组中删除所有空元素?
- 比较JUnit断言中的数组,简洁的内置方式?
- codestyle;把javadoc放在注释之前还是之后?
- 如何在Spring中定义List bean ?
- 将Set<T>转换为List<T>的最简洁的方法
- 在JavaScript中,什么相当于Java的Thread.sleep() ?
- 使用Java重命名文件
- URL从Java中的类路径加载资源
- .toArray(new MyClass[0]) or .toArray(new MyClass[myList.size()])?
- Hibernate中不同的保存方法之间有什么区别?
- Java 8流和数组操作
- Java Regex捕获组
- Openssl不被视为内部或外部命令