gpt4 book ai didi

java - double 四舍五入到小数点后两位

转载 作者:行者123 更新时间:2023-12-02 00:29:45 30 4
gpt4 key购买 nike

如果值为 200.3456 ,则应将其格式化为 200.34 。如果是 200 ,那么它应该是 200.00

最佳答案

这是一个实用程序,可以将 double 舍入(而不是截断)到指定的小数位数。

例如:

round(200.3456, 2); // returns 200.35

原始版本;小心这个

public static double round(double value, int places) {
if (places < 0) throw new IllegalArgumentException();

long factor = (long) Math.pow(10, places);
value = value * factor;
long tmp = Math.round(value);
return (double) tmp / factor;
}

在小数位数非常多(例如 round(1000.0d, 17))或大整数部分(例如 圆形(90080070060.1d,9))。感谢 Sloin 指出了这一点。

多年来,我一直在使用上述方法将“不太大”的 double 四舍五入到小数点后 2 或 3 位(例如,出于记录目的以秒为单位清理时间:27.987654321987 -> 27.99)。但我想最好避免它,因为更可靠的方法很容易获得,而且代码也更简洁。

所以,用这个代替

(改编自 this answer by Louis Wassermanthis one by Sean Owen 。)

public static double round(double value, int places) {
if (places < 0) throw new IllegalArgumentException();

BigDecimal bd = BigDecimal.valueOf(value);
bd = bd.setScale(places, RoundingMode.HALF_UP);
return bd.doubleValue();
}

请注意,HALF_UP 是“学校普遍教授的”舍入模式。如果您怀疑您需要其他东西,例如 RoundingMode documentation ,请仔细阅读 Bankers’ Rounding

当然,如果您愿意,您可以将以上内容内联到一行中:
new BigDecimal(value).setScale(places, RoundingMode.HALF_UP).doubleValue()

在任何情况下

永远记住,使用floatdouble的浮点表示是不精确的。例如,考虑以下表达式:

999199.1231231235 == 999199.1231231236 // true
1.03 - 0.41 // 0.6200000000000001

For exactness, you want to use BigDecimal。在此过程中,请使用采用 String 的构造函数,而不是采用 double 的构造函数。例如,尝试执行以下命令:

System.out.println(new BigDecimal(1.03).subtract(new BigDecimal(0.41)));
System.out.println(new BigDecimal("1.03").subtract(new BigDecimal("0.41")));

关于该主题的一些优秀的进一步阅读:

<小时/>

如果您想要字符串格式而不是(或除了)严格舍入数字,请参阅其他答案。

具体来说,请注意 round(200, 0) 返回 200.0。如果你想输出“200.00”,你应该先舍入然后格式化结果输出(Jesper's answer 中有完美的解释)。

关于java - double 四舍五入到小数点后两位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58025556/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com