不使用格式化的printf就可以在java中精确地强制转换吗?
此行产生双值不使用格式化的printf就可以在java中精确地强制转换吗?,java,casting,Java,Casting,此行产生双值3。3333 5 System.out.println(“名称+”的平均分数=“+(双)和/3”) 可以设置精度的宽度吗?打印的结果(与printf的结果相同,只需额外的一步),或者使用a(如果您想要具有任意精度的类型)。您可以使用DecimalFormat或BigDecimal,如下所示: import java.math.BigDecimal; import java.math.RoundingMode; import java.text.DecimalFormat; publ
3。3333 5
System.out.println(“名称+”的平均分数=“+(双)和/3”)代码>
可以设置精度的宽度吗?打印的结果(与printf
的结果相同,只需额外的一步),或者使用a(如果您想要具有任意精度的类型)。您可以使用DecimalFormat
或BigDecimal
,如下所示:
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
public class Main {
public static void main(String[] args) {
int sum = 10;
DecimalFormat decimalFormat = new DecimalFormat("#.##");
System.out.println(Double.valueOf(decimalFormat.format((double) sum / 3)));
// Another way
System.out.println(new BigDecimal(String.valueOf((double) sum / 3)).setScale(2, RoundingMode.HALF_UP));
// The better way using BigDecimal - thanks to @Andreas
System.out.println(BigDecimal.valueOf(sum).divide(BigDecimal.valueOf(3), 2, RoundingMode.HALF_UP));
}
}
输出:
3.33
3.33
3.33
一种解决方案是编写函数:
static double roundWithTwoDigits(double x) {
return (double) Math.round(x * 100) / 100;
}
现在您可以使用它:
System.out.println("Average marks of " + name + " = " + roundWithTwoDigits((double) sum / 7));
这回答了你的问题吗?这不是演员阵容。这是打印号,精度是用双精度固定的。这就是为什么如果您想要一个不同的表示形式,就需要格式化它。@Amongalen这在printf方法中是可能的,但我想知道printfit是否可以。这就是允许格式化输出的原因之一。printf
允许格式化输出。使用BigDecimal.valueOf(sum).divide(BigDecimal.valueOf(3),2,RoundingMode.HALF_UP)代替在执行double
时可能出现的精度损失。
。您现在可以超过双精度
,例如25位小数,结果是3.3333333333
,而通过双精度
将导致3.3333333335000000000
。我认为它对非常大的数字不起作用,是吗?是的,对于非常大的数字,应该使用大小数。更重要的是要回答如何在没有格式的情况下获得两位数的精确数字。这是可能的,但它肯定是有限的,应该使用格式化来格式化,或者使用BigDecimal来控制精度。