在Java中格式化带有小数位的数字符号而不进行除法的正确方法

Posted

技术标签:

【中文标题】在Java中格式化带有小数位的数字符号而不进行除法的正确方法【英文标题】:Correct way to format a notation of a number with decimal scale in Java without dividing 【发布时间】:2015-08-03 14:45:49 【问题描述】:

我在Java 中阅读了有关数字转换的内容,因为我需要在我的 android 应用程序中格式化数字。

我目前持有一个 4 位数的 long 变量

long variable_1 = 2203;

这就是我要打印的内容

220.3

到目前为止我做了什么

variable_1 = 2203;
BigDecimal bd = new BigDecimal(variable_1);
bd = bd.setScale(1, BigDecimal.ROUND_HALF_UP);

txtView_variable_1.setText(String.valueOf(bd));

结果

2203.0

我在这里做错了什么?

【问题讨论】:

How do I format a number in java?的可能重复 尝试除以 10 吗? 简单的解决方法,但我实际上很期待知道为什么它没有转换为220.3 因为 220.3 不是 2203 的科学计数法? @Holmes 更改比例将返回具有指定比例但具有相同数值的新BigDecimal。它不会改变未缩放数字的解释。基础缩放数字将被重新缩放。请参阅我的答案,了解正确解释未缩放数字的方法。 【参考方案1】:

如果您更改BigDecimal 的比例,它将返回具有指定比例但具有相同数值的新BigDecimal。它不会改变未缩放数字的解释。底层的缩放数字将被重新缩放。

您应该在 BigDecimal 初始化时给出比例,以便它正确解释您的未缩放数字:

long variable_1 = 2203;
BigDecimal bd = new BigDecimal(BigInteger.valueOf(variable_1), 1);
System.out.println(String.valueOf(bd));

哪些输出:

220.3

【讨论】:

谢谢@zakinster。这就是我一直在寻找的。​​span> 【参考方案2】:

我在 0.1 时遇到了同样的问题 我是这样管理的:

  private BigDecimal roundBigDecimal(BigDecimal valueToRound) 
    int valeurEntiere = valueToRound.intValue();
    String str = String.valueOf(valeurEntiere);
    int rounding = valeurEntiere == 0 ? 1 : str.length() + 1;
    return new BigDecimal(String.valueOf(valueToRound), new MathContext(rounding, RoundingMode.HALF_UP));
  

其实int的四舍五入取决于数字的位数。

【讨论】:

以上是关于在Java中格式化带有小数位的数字符号而不进行除法的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

JAVA 中除法后小数精度问题

EXCEL表格中,怎么把一列数字做除法,保留小数点两位?

Java中怎么把除法精确到小数点后100位

使用自定义组和小数分隔符将数字格式化为字符串而不更改精度

excel2007除法结果为啥只有整数,怎样才能保留两位小数?

LeetCode 405. 数字转换为十六进制数(补码的问题) / 166. 分数到小数(模拟长除法) / 482. 密钥格式化