最近我在处理数字时遇到一个情况,我希望根据数据库中存储的值设置双精度数值的精度为6位或4位。
例如,如果数据库中的精度设置为4位,则输出必须如下所示:
10.0000
。
我尝试使用 DecimalFormat
并使用字符串 ##.####
,但每次都需要使用符号非常麻烦。
是否有更好的方法,比如以下示例:
Double value = 10.0;
value.setPrecision(4);
最近我在处理数字时遇到一个情况,我希望根据数据库中存储的值设置双精度数值的精度为6位或4位。
例如,如果数据库中的精度设置为4位,则输出必须如下所示:
10.0000
。
我尝试使用 DecimalFormat
并使用字符串 ##.####
,但每次都需要使用符号非常麻烦。
是否有更好的方法,比如以下示例:
Double value = 10.0;
value.setPrecision(4);
您可以尝试使用BigDecimal来实现此目的。
Double toBeTruncated = new Double("3.5789055");
Double truncatedDouble = BigDecimal.valueOf(toBeTruncated)
.setScale(3, RoundingMode.HALF_UP)
.doubleValue();
由于浮点数没有十进制位,而是二进制位,因此无法将double(或Double)的精度设置为指定数量的小数位。
如果您希望稍后使用该值,则需要通过BigDecimal
或DecimalFormat
将其转换为十进制数。
另请参见我的答案此问题,以反驳不可避免的*100/100答案。
这是一个简单的方法:
String formato = String.format("%.2f");
它将精度设置为2个数字。
如果你只想打印输出,可以这样使用:
System.out.printf("%.2f",123.234);
double myDouble = 42.99; String formatted = String.format("%.2f", myDouble);
- jdex为双精度值设置精度的好方法是使用DecimalFormat
。要使用这个类,需要导入java.text.DecimalFormat
并创建它的对象,例如:
To set precision for double values DecimalFormat
是好的技术。要使用这个类,导入java.text.DecimalFormat
并创建其对象,例如
double no=12.786;
DecimalFormat dec = new DecimalFormat("#0.00");
System.out.println(dec.format(no));
所以这里会打印小数点后两位,将打印12.79
这对我有效:
public static void main(String[] s) {
Double d = Math.PI;
d = Double.parseDouble(String.format("%.3f", d)); // can be required precision
System.out.println(d);
}
以下是一种高效的方法,但有两个注意事项。
请在此处查看示例测试用例。
123.12345678 ==> 123.123
1.230000 ==> 1.23
1.1 ==> 1.1
1 ==> 1.0
0.000 ==> 0.0
0.00 ==> 0.0
0.4 ==> 0.4
0 ==> 0.0
1.4999 ==> 1.499
1.4995 ==> 1.499
1.4994 ==> 1.499
以下是代码。我上面提到的两个注意事项可以很容易地解决,但是对于我来说速度比准确性更重要,因此我将其留在这里。
与数学运算相比,像System.out.printf("%.2f",123.234);
这样的字符串操作在计算上是昂贵的。在我的测试中,下面的代码(不带sysout)花费的时间是字符串操作的1/30。
public double limitPrecision(String dblAsString, int maxDigitsAfterDecimal) {
int multiplier = (int) Math.pow(10, maxDigitsAfterDecimal);
double truncated = (double) ((long) ((Double.parseDouble(dblAsString)) * multiplier)) / multiplier;
System.out.println(dblAsString + " ==> " + truncated);
return truncated;
}
double
和float
的精度由它们的大小和IEEE浮点类型实现方式固定。
另一方面,输出中的小数位数是格式问题。您说得对,重复输入相同的常量是不好的做法。您应该声明一个字符串常量,并使用其符号表示。
private static final String DBL_FMT = "##.####";
BigDecimal value = new BigDecimal(10.0000);
value.setScale(4);
10.01
时会引发“需要四舍五入”的异常! - user12268814public static String setPrecision(String number, int decimal) {
double nbr = Double.valueOf(number);
int integer_Part = (int) nbr;
double float_Part = nbr - integer_Part;
int floating_point = (int) (Math.pow(10, decimal) * float_Part);
String final_nbr = String.valueOf(integer_Part) + "." + String.valueOf(floating_point);
return final_nbr;
}