我有两个双变量:
double a = 1.109
double b = 5.0E-5;
但是b
是可以改变的,我希望根据b
数字获得固定数量的小数位数,例如上面我希望达到这个结果:
Result = 1.10900
但不仅打印,我需要将其发送到其他方法,我的双必须有固定数量的小数位,如例子。
答案 0 :(得分:3)
听起来你想要实际值的任意精度(而不仅仅是输出)。 double
并没有给你这个。 BigDecimal
确实如此。它的BigDecimal(String)
constructor设置字符串的值和比例(小数点右边的位数),所以:
BigDecimal d = new BigDecimal("1.10900");
BigDecimal
然后为您提供各种数学运算以保持在该范围内,并提供各种舍入选项。
如果您在某个时候需要获得double
的{{1}}值,则可以使用其doubleValue
method。但请注意,此时,您再也不会在小数点右侧有固定数量的位置。
以下是对比BigDecimal
和BigDecimal
(Live Copy)的示例:
double
输出:
1.109 / 27 using BigDecimal to five places: 0.04107 1.109 / 27 using double: 0.041074074074074075
答案 1 :(得分:1)
尝试使用数字格式化程序:
NumberFormat formatter = new DecimalFormat("#0.00000");
double a = 1.109;
double b = 5.0E-5;
System.out.println(a);
System.out.println(b);
<强>输出:强>
1.10900
0.00005
答案 2 :(得分:0)
一个简单的解决方案是根据需要对结果进行舍入。这不仅比使用BigDecimal更快,而且因为Java没有BigDecimal语言支持使得编写/读取和验证更加困难,因此它不易出错。将半个舍入为5个十进制空格的简单方法是
public static double round5(double d) {
final double factor = 1e5;
return d > Long.MAX_VALUE / factor || d < -Long.MAX_VALUE / factor ? d :
(long) (d < 0 ? d * factor - 0.5 : d * factor + 0.5) / factor;
}
注意:当您打印double
时,您仍需要指定所需的小数位数。
System.out.printf("%.5f", value);
答案 3 :(得分:-1)
使用java printf
- 就像例程一样(注意它产生平台相关的小数分隔符):
String.format("%.5f", a)