在Java中截断浮点数和双精度数

14
我想在Java中截断float和double类型的值。
以下是我的要求: 1. 如果有一个12.49688f,它应该以12.49的形式打印,而不进行四舍五入。 2. 如果它是12.456的双精度数,它应该以12.45的形式打印,而不进行四舍五入。 3. 在任何情况下如果值为12.0,则应该只打印12。
条件3需要始终谨记。它应与截断逻辑相一致。

请查看:https://dev59.com/bnI-5IYBdhLWcg3wMFS0 - BeRecursive
1
格式化打印并不等同于截断。截断会改变数据值。你对“截断”一词的使用是不正确和误导性的。我建议你适当编辑问题的标题和正文。对于那些寻找真正截断的读者,请参见在Java中截断双精度浮点数的任何函数吗?,由BeRecursive评论 - Basil Bourque
6个回答

27

试一下这个 -

DecimalFormat df = new DecimalFormat("##.##");
df.setRoundingMode(RoundingMode.DOWN);
System.out.println(df.format(12.49688f));
System.out.println(df.format(12.456));
System.out.println(df.format(12.0));

在这里,我们使用十进制格式化器进行格式化。将roundmode设置为DOWN,这样它就不会自动舍入小数位。

预期结果是:

12.49
12.45
12

本地化适用于此示例。根据默认区域设置,输出将为12.49。 - Marcelo Benites

4
double d = <some-value>;
System.out.println(String.format("%.2f", d - 0.005);

4
我在使用安卓时也遇到了同样的问题,你可以使用以下方法代替:
DecimalFormat df = new DecimalFormat("##.##");
df.setRoundingMode(RoundingMode.DOWN);

但是这需要API Level 9及以上版本。

另一种快速解决方案是:

double number = 12.43543542;
int aux = (int)(number*100);//1243
double result = aux/100d;//12.43

2

使用DecimalFormat()进行查看:

DecimalFormat df = new DecimalFormat("#.##");
DecimalFormatSymbols dfs = new DecimalFormatSymbols();
dfs.setDecimalSeparator(',');
df.setDecimalFormatSymbols(dfs);

1
将其改为使用“#”而不是“0”,它就可以按照规定工作。 - Dunes

1

请检查 java.math.BigDecimal.round(MathContext)


那个方法似乎不存在?API文档 - Eddie Curtis
@jimmycarr http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html#round(java.math.MathContext) - Torben
哇...我怎么会错过那个?谢谢 @Torben - Eddie Curtis

0

尝试使用{{link1:DecimalFormat}}并将{{link2:RoundingMode}}设置为您所需的匹配方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接