在java中,如何在不使用BigDecimal的情况下打印不超过4位小数的数字而不进行舍入

在java中,如何在不使用BigDecimal的情况下打印不超过4位小数的数字而不进行舍入,java,Java,如果输入=31.6227890 然后输出=31.6227 但输出为31.6228,您可以使用以下功能: import java.text.DecimalFormat; import java.math.RoundingMode; public static double formatValue(Double number) { DecimalFormat df = new DecimalFormat("####0.0000"); return Double.pa

如果输入=31.6227890 然后输出=31.6227
但输出为31.6228,您可以使用以下功能:

import java.text.DecimalFormat;
import java.math.RoundingMode;

public static double formatValue(Double number) {
        DecimalFormat df = new DecimalFormat("####0.0000");
        return Double.parseDouble(df.format(number));
    }
编辑: 您必须添加以下四舍五入代码

df.setRoundingMode(RoundingMode.DOWN);
输入=31.6227890


Output=31.6227

如果要向下取整,可以像这样使用截断

double d = 31.6227890;
d = ((long) (d * 10000)) / 10000.0; // truncates down to 0
System.out.println(d);
印刷品

31.6227
31.6
31.6000
1024.0002
注意:这可能会打印少于4位数字。如果你总是想要4,你需要使用格式

d = 31.60007890;
d = ((long) (d * 10000)) / 10000.0; // truncates down to 0
System.out.println(d);
System.out.printf("%.4f%n", d);
印刷品

31.6227
31.6
31.6000
1024.0002
注意:对于较大的值,您不会对其进行四舍五入,因为这将导致溢出

private static final double WHOLE_NUMBER = 1L << 53;
public static double trunc4(double d) {
    final double factor = 1e4;
    return Math.abs(d) >= WHOLE_NUMBER / factor 
           ? d 
           : ((long) (d * factor)) / factor;
}
印刷品

31.6227
31.6
31.6000
1024.0002
浮点数i=(浮点数)(整数)(31.6227890*10000))/10000


系统输出打印LN(i)

您可以将它乘以每1000,使用Math.floor()并将其除以每1000

    double a = 10.345665654;
    double b = Math.floor(a * 10000) / 10000;
    System.out.println(b);

您可以使用BigDecimal进行四舍五入:

new BigDecimal(31.6227890d).setScale(4, RoundingMode.DOWN)
返回所需结果:
31.6227

对于
double
,可以使用
.doubleValue()


你是哪种类型的<代码>双倍,还是其他什么?请注意,浮点运算在Java中是不精确的。请用a来演示您的问题。@TimBiegeleisen我正在使用Double当打印减少0.00005:)您确定这不会对结果进行四舍五入吗?1.)这四舍五入。2.)根据您的语言环境,它将输出逗号分隔的字符串,而不是点分隔的字符串(
21234
not
2.1234
)这同样不能被解析回来。谢谢,但是它的返回值是31.6228,而不是31.6227approach@PeterLawrey它对结果进行四舍五入。我可以在四舍五入到5位后截断值。处理它时通常会出现fp不准确的情况。您需要更多的小数位。对于较大的d值,这也不能正常工作(即,我们使用精度和风险溢出)。对于“正常”值,这将是很好的,但这是可行的。谢谢:)成功了。非常感谢:)由于float只有6位精度,这对100或更多的“大”数字不起作用也会使int溢出正确,这失败的最小值是1024.0003,请参阅我的回答说明
System.out.println(新的BigDecimal(0.0003d).setScale(4,RoundingMode.DOWN))打印
0.0002
我怀疑
BigDecimal.valueOf(…)
会更好。