Java - double 常量小数位数
Java - double constant number of decimal places
我有两个双变量:
double a = 1.109
double b = 5.0E-5;
但是 b
是可变的,我想根据 b
数字实现固定的小数位数,例如上面我想实现这个结果:
Result = 1.10900
但不仅是打印,我还需要将它发送到其他方法,我的双精度数必须像示例中那样具有固定的小数位数。
尝试使用数字格式化程序:
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
听起来您希望实际值具有任意精度(而不是仅仅输出)。 double
不会给你那个。 BigDecimal
does though. Its BigDecimal(String)
constructor 从字符串设置值和比例(小数点右边的位数),因此:
BigDecimal d = new BigDecimal("1.10900");
BigDecimal
然后为您提供各种数学运算以保持在该范围内,并提供各种舍入选项。
如果在某些时候您需要获取 BigDecimal
的 double
值,您可以使用它的 doubleValue
method。但请注意,此时小数点右边的位数不再固定。
这是一个对比 BigDecimal
和 double
(Live Copy) 的例子:
import java.math.*;
class Example
{
public static void main (String[] args) throws java.lang.Exception
{
BigDecimal bd = new BigDecimal("1.10900");
bd = bd.divide(new BigDecimal("27"), BigDecimal.ROUND_HALF_DOWN);
System.out.println("1.109 / 27 using BigDecimal to five places: " + bd);
double d = 1.109;
d = d / 27.0;
System.out.println("1.109 / 27 using double: " + d);
}
}
输出:
1.109 / 27 using BigDecimal to five places: 0.04107
1.109 / 27 using double: 0.041074074074074075
使用类似于 java printf
的例程(注意它会产生平台相关的小数点分隔符):
String.format("%.5f", a)
一个简单的解决方案是根据需要对结果进行四舍五入。这不仅比使用 BigDecimal 更快,而且更不容易出错,因为 Java 没有对 BigDecimal 的语言支持,这使得 write/read 和验证变得更加困难。将 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);
我有两个双变量:
double a = 1.109
double b = 5.0E-5;
但是 b
是可变的,我想根据 b
数字实现固定的小数位数,例如上面我想实现这个结果:
Result = 1.10900
但不仅是打印,我还需要将它发送到其他方法,我的双精度数必须像示例中那样具有固定的小数位数。
尝试使用数字格式化程序:
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
听起来您希望实际值具有任意精度(而不是仅仅输出)。 double
不会给你那个。 BigDecimal
does though. Its BigDecimal(String)
constructor 从字符串设置值和比例(小数点右边的位数),因此:
BigDecimal d = new BigDecimal("1.10900");
BigDecimal
然后为您提供各种数学运算以保持在该范围内,并提供各种舍入选项。
如果在某些时候您需要获取 BigDecimal
的 double
值,您可以使用它的 doubleValue
method。但请注意,此时小数点右边的位数不再固定。
这是一个对比 BigDecimal
和 double
(Live Copy) 的例子:
import java.math.*;
class Example
{
public static void main (String[] args) throws java.lang.Exception
{
BigDecimal bd = new BigDecimal("1.10900");
bd = bd.divide(new BigDecimal("27"), BigDecimal.ROUND_HALF_DOWN);
System.out.println("1.109 / 27 using BigDecimal to five places: " + bd);
double d = 1.109;
d = d / 27.0;
System.out.println("1.109 / 27 using double: " + d);
}
}
输出:
1.109 / 27 using BigDecimal to five places: 0.04107 1.109 / 27 using double: 0.041074074074074075
使用类似于 java printf
的例程(注意它会产生平台相关的小数点分隔符):
String.format("%.5f", a)
一个简单的解决方案是根据需要对结果进行四舍五入。这不仅比使用 BigDecimal 更快,而且更不容易出错,因为 Java 没有对 BigDecimal 的语言支持,这使得 write/read 和验证变得更加困难。将 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);