【问题标题】:I need to round a float to two decimal places in Java [duplicate]我需要在Java中将浮点数四舍五入到小数点后两位[重复]
【发布时间】:2012-06-19 19:15:42
【问题描述】:

可能重复:
How to round a number to n decimal places in Java

我很难将浮点数四舍五入到小数点后两位。我尝试了一些我在这里看到的方法,包括仅使用Math.round(),但无论我做什么,我都会不断收到不寻常的数字。

我有一个我正在处理的浮点数列表,列表中的第一个显示为1.2975118E7E7 是什么?

当我使用Math.round(f)(f 是浮点数)时,我得到完全相同的数字。

我知道我做错了什么,只是不确定是什么。

我只希望数字格式为x.xx。第一个数字应该是1.30等。

【问题讨论】:

  • 您要对浮点数的字符串显示进行四舍五入。您可能不想对数字本身进行四舍五入。避免使用浮点数,而是使用双精度数来获得更高的精度,然后查看可用的多种方法之一,这些方法可以很好地显示双精度数的字符串,包括 String.format(...)、NumberFormat 或 DecimalFormat。

标签: java android floating-point


【解决方案1】:

尝试查看BigDecimal 类。它是货币的入门级,并支持精确的四舍五入。

【讨论】:

  • 我不明白你能提供更多的澄清吗?
  • 我不明白为什么你的回答被否决了
  • 也不确定。它甚至获得了删除投票。
【解决方案2】:

1.2975118E7scientific notation

1.2975118E7 = 1.2975118 * 10^7 = 12975118

另外,Math.round(f) 返回一个整数。你不能用它来得到你想要的格式x.xx

你可以使用String.format

String s = String.format("%.2f", 1.2975118);
// 1.30

【讨论】:

  • String.format 会产生问题,因为它会根据语言环境创建带有点或逗号的浮点数。
  • @YoannHercouet,你不能不考虑语言环境就到处玩花车。那应该不是问题。 ;-)
  • 使用这个:String.format(Locale.US, "%.2f", 1.2975118) 更安全..至少你总是知道格式......
【解决方案3】:

如果您正在寻找货币格式(您没有指定,但您似乎正在寻找),请尝试使用 NumberFormat 类。很简单:

double d = 2.3d;
NumberFormat formatter = NumberFormat.getCurrencyInstance();
String output = formatter.format(d);

将输出哪个(取决于语言环境):

$2.30

另外,如果不需要货币(只需要精确的两位小数),您可以使用它来代替:

NumberFormat formatter = NumberFormat.getNumberInstance();
formatter.setMinimumFractionDigits(2);
formatter.setMaximumFractionDigits(2);
String output = formatter.format(d);

这将输出2.30

【讨论】:

  • 不确定。我对你和@Makato 投了赞成票,因为它们是第一个解决真正问题的人:浮点数的格式化字符串表示。
  • 不错的答案,但我有一个问题:))。一个我还没有找到答案的问题。这是一个字符串,服务器正在等待我发送一个浮点数。我尝试使用 Float.valueOf() 或 parseFloat():如果它是 0.10003482948329,它将得到我需要的 0.10。但如果是 2.00000000000,我会得到 2,我需要 2.00(必须是浮点数)
  • @rosualin ,这可能不是一个好方法,但如果你只是想在 UI 中显示它而不是用它来计算,那么,String.valueOf(RESULT[2])+".00" 然后又是parseFloat : -P
【解决方案4】:

您可以使用DecimalFormat 为您提供您想要的样式。

DecimalFormat df = new DecimalFormat("0.00E0");
double number = 1.2975118E7;
System.out.println(df.format(number));  // prints 1.30E7

由于它采用科学计数法,因此您将无法获得小于 107 的数字而不会损失那么多数量级的精度。

【讨论】:

  • 感谢大家的帮助。科学记数法让我着迷,我认为它不起作用,因为数字相同,但我的数字一开始就错了!
  • 我可以从这里返回浮点值吗:float roundofDecimal(float dd){ DecimalFormat df = new DecimalFormat(); df.setMaximumFractionDigits(2); System.out.println(df.format(dd));返回 df.format(dd); }
  • @PintuCorna:不——看起来没有任何方法可以从DecimalFormat 中取回浮动。老实说,如果你从双精度数变为浮点数,你就会失去精度。此外,格式化数字是读取数据的人的一种形式 - 如果您想要原始浮点数,只需返回 that!
  • 好吧,因为我想要精确的浮点数中的两个小数点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-20
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
相关资源
最近更新 更多