如何在java中始终保留2位小数

jq6vz3qz  于 2021-07-06  发布在  Java
关注(0)|答案(6)|浏览(296)

在java中,我想将任何double四舍五入为一个带2个小数位的字符串。我试过使用decimalformat,但是没有得到预期的结果。任何帮助都将不胜感激。
例如:i/p:3402100.5323
我想把它转换成:
订单号:34.02
我试过使用decimalformat(“##,##,###,##0.00”,新的decimalformatsymbols(locale.us)),但结果是3402100.53,而我希望它输出34.02
ps:如果i/p是34.02,我希望即使应用了格式,它也会保持不变

x8goxv8g

x8goxv8g1#

String.format("%0.2f", 34.021005323)

看到了吗https://docs.oracle.com/javase/7/docs/api/java/lang/string.html#format(java.lang.string、%20java.lang.object…)和https://docs.oracle.com/javase/7/docs/api/java/util/formatter.html#syntax

vc9ivgsu

vc9ivgsu2#

你可以用这个格式试试这个它的工作100%为我。

String.format("%.2f", value)

有用的链接
https://docs.oracle.com/javase/7/docs/api/java/util/formatter.html#syntax

xhv8bpkk

xhv8bpkk3#

在我看来,这可以通过两个步骤来实现:
将数字转换为您定制的四舍五入(3402100.5323至34.021005323)。将输入除以10的幂,使其四舍五入为2位数。
然后可以漂亮地打印转换后的数字,以截断2位小数后的值(34.021005323到34.02)

public static void main(String[] args) {
  double input = 3402100.5323;

  double output = input / getDivisor(input);
  System.out.printf("%.2f%n", output);
}

private static double getDivisor(double input) {
  int length = String.valueOf((long) input).length();
  return Math.pow(10, length - 2) ;
}

输出:34.02

gblwokeq

gblwokeq4#

我想你要找的是java.math.bigdecimal类(https://docs.oracle.com/javase/8/docs/api/java/math/bigdecimal.html).
在你的例子中,它看起来是这样的:

BigDecimal rounded = BigDecimal.valueOf(yourDoubleValueHere).setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println(rounded); // 34.02

它可以通过基本上以十进制形式存储数字来替换双精度(尽管语法更复杂),这意味着您可以对其进行操作,并保持两位小数,避免四舍五入问题。
edit:仔细想想,这可能有点过头了,因为您只想得到一个具有舍入值的字符串,但我会把它留在那里以防万一。

xurqigkl

xurqigkl5#

把一个数字变成完全不同的东西,自然不是decimalformat的工作。
要从代表3402100.5323的数字到字符串“34.02”,首先必须得到一个更接近“34.02”的数字。换句话说,先除以10000.0。
从那里开始, String.format("%.2f") 这似乎是一条简单的路径:将任何double转换为字符串,但在小数点分隔符后使用的数字不能超过2位。如果你想让3400000.123变成“34.00”而不是“34”,你可以这样做 String.format("%.02f") 强制零。

public String renderWhateverThatIs(double in) {
    return String.format("%.02f", in / 100000.0);
}

renderWhateverThatIs(3402100.5323);
> 34,02

请注意,如果您看到一个点或逗号作为分隔符,机器区域设置将指示。您可以通过显式地将区域设置传递给 format .

kxxlusnw

kxxlusnw6#

我不相信你可以实现你想要的(前4位数字转换成2位双精度小数点后2位)在一个单一的步骤。我将分解步骤,尝试一种方法:
将双精度输入转换为字符串

double d = 3402100.5323;
String dStr1 = String.valueOf(d); // dStr1 will be “3402100.5323”

接下来,从字符串中删除小数点

String dStr2 = dStr1.replace(‘.’,’’); // dStr2 will be “34021005323”

然后,抓住你感兴趣的前4个数字

String dStr3 = dStr2.substring(0,4); // dStr3 will be “3402”

最后,插入一个小数点

String result = dStr3.substring(0,2) + “.” + dStr3.substring(2); // result will be “34.02”

相关问题