安卓数字格式

7

在我的应用程序中,我想将一个双精度数保留到小数点后2位有效数字。我尝试了下面的代码。

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

此外,我尝试了一下

double val = ....;
val = val*100;
val = (double)((int) val);
val = val /100;

两段代码都对我无效。

提前感谢......


你能举个错误的输入/输出例子吗? - Andreas Brinck
当我输入0.5时,它返回0.5。实际上,我需要输出0.50。另外,当我输入2.0时,我需要一个输出2.00。 - upv
2
数字0.5和0.50是无法区分的,你的问题不在于四舍五入的代码,而在于显示数字的代码。 - Andreas Brinck
2
标题中的“Android”是什么意思?需要重新标记吗? - Riccardo Cossu
与实际问题无关:代码的第二个版本可能应该使用 val = val * 100 + 0.5 - Andreas Brinck
6个回答

20

正如Grammin所说,如果你在尝试表示金钱,请使用BigDecimal。该类支持各种舍入方式,并且您可以完全设置所需的精度。

但是要直接回答您的问题,您无法在double上设置精度,因为它是浮点数。它没有精度。如果您只需要格式化输出,我建议使用NumberFormat。例如:

NumberFormat nf = NumberFormat.getInstance();
nf.setMinimumFractionDigits(2);
nf.setMaximumFractionDigits(2);
String output = nf.format(val);

6

2
我建议如果您要表示货币,使用BigDecimal

这个example可能会有所帮助。


我也尝试了下面的代码。public static double round(double unrounded) { BigDecimal bd = new BigDecimal(unrounded); BigDecimal rounded = bd.setScale(2, BigDecimal.ROUND_HALF_UP); return rounded.doubleValue(); } - upv

0
如Gramming所建议的,您可以使用BigDecimals,或者使用NumberFormat来确保显示数字的位数。

0

你的代码在我这里看起来是可以工作的

double rounded = round(0.123456789, 3);
System.out.println(rounded);

>0.123

编辑:刚看到你在问题中的新评论。这是一个格式问题,而不是数学问题。


0

我决定将所有内容都转换为整数类型。这样就不会有问题。

DecimalFormatSymbols currencySymbol = DecimalFormatSymbols.getInstance();
NumberFormat numberF = NumberFormat.getInstance();

之后...

numberF.setMaximumFractionDigits(2);
numberF.setMinimumFractionDigits(2);

TextView tv_total = findViewById(R.id.total);
int total = doYourStuff();//calculate the prices
tv_total.setText(numberF.format(((double)total)/100) + currencySymbol.getCurrencySymbol());

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