如何在 Java 中格式化双输入而不对其进行四舍五入?

sam*_*333 4 java double formatting

我已经阅读了这个问题将双精度舍入到小数点后两位它显示了如何舍入数字。我想要的只是简单的格式,只打印两位小数。我所拥有的和我尝试过的:

double res = 24.695999999999998;
DecimalFormat df = new DecimalFormat("####0.00");
System.out.println("Value: " + df.format(res)); //prints 24.70 and I want 24.69
System.out.println("Total: " + String.format( "%.2f", res )); //prints 24.70
Run Code Online (Sandbox Code Playgroud)

所以当我有 24.695999999999998 我想把它格式化为 24.69

Dav*_*ang 7

将数字乘以 100 并将其转换为整数。这会截掉除您想要的两个小数位之外的所有小数位。将结果除以 100.00。(24.69)。

int temp = (int)(res * 100);
double result = temp / 100.00;
Run Code Online (Sandbox Code Playgroud)

或者一行代码中的相同内容:

double result = ((int)(res * 100)) / 100.00;
Run Code Online (Sandbox Code Playgroud)


Ell*_*sch 6

除了使用Math.floor(double)和计算比例(例如* 100,然后/ 100.0计算两个小数点)之外,您还可以使用BigDecimal,然后您可以setScale(int, int)调用

double res = 24.695999999999998;
BigDecimal bd = BigDecimal.valueOf(res);
bd = bd.setScale(2, RoundingMode.DOWN);
System.out.println("Value: " + bd);
Run Code Online (Sandbox Code Playgroud)

这也会给你(所要求的)

Value: 24.69
Run Code Online (Sandbox Code Playgroud)


Old*_*eon 5

您需要先获取floordouble 值的 ,然后对其进行格式化。

Math.floor(double)

返回小于或等于参数且等于数学整数的最大(最接近正无穷大)双精度值。

所以使用类似的东西:

double v = Math.floor(res * 100) / 100.0;
Run Code Online (Sandbox Code Playgroud)

其他替代方法包括使用BigDecimal.

public void test() {
    double d = 0.29;
    System.out.println("d=" + d);
    System.out.println("floor(d*100)/100=" + Math.floor(d * 100) / 100);
    System.out.println("BigDecimal d=" + BigDecimal.valueOf(d).movePointRight(2).round(MathContext.UNLIMITED).movePointLeft(2));
}
Run Code Online (Sandbox Code Playgroud)

印刷

d=0.29
floor(d*100)/100=0.28
BigDecimal d=0.29
Run Code Online (Sandbox Code Playgroud)