- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
为什么这个 DecimalFormat
没有按预期使用 RoundingMode.HALF_UP
进行舍入,应该怎么做才能获得预期的输出?可以用 DecimalFormat
来完成吗?
DecimalFormat df = new DecimalFormat("0.0");
df.setRoundingMode(RoundingMode.HALF_UP);
df.format(0.05); // expecting 0.1, getting 0.1
df.format(0.15); // expecting 0.2, getting 0.1 << unexpected
df.format(0.06); // expecting 0.1, getting 0.0 << unexpected
我已经看到this question的答案了, 具体来说 this answer , 但它似乎只在四舍五入为整数时才有效。
我的JDK是8.0.110,我的JRE是8.0.730.2
最佳答案
(使用 Java 8 回答下面的问题。)
您看到的问题来自于在代码中指定“0.15”或“0.05”,当表示为 double 值时,它略小于 0.15。看看这个
DecimalFormat df = new DecimalFormat("#.#");
df.setRoundingMode(RoundingMode.HALF_UP);
BigDecimal bd = new BigDecimal(0.15);
System.out.println("bd=" + bd);
System.out.println(df.format(0.15)); // expecting 0.1, getting 0.1
bd = new BigDecimal(0.05);
System.out.println("bd=" + bd);
System.out.println(df.format(0.05));
bd = new BigDecimal(0.06);
System.out.println("bd=" + bd);
System.out.println(df.format(0.06));
这段代码的输出是
bd=0.1499999999999999944488848768742172978818416595458984375
0.1
bd=0.05000000000000000277555756156289135105907917022705078125
0.1
bd=0.059999999999999997779553950749686919152736663818359375
0.1
一个可能的解决方案(如果您绝对需要它以正确的方式四舍五入)是使用 BigDecimal.valueOf 来创建值。例如
BigDecimal bd = BigDecimal.valueOf(0.15);
System.out.println("bd=" + bd);
System.out.println(df.format(bd)); // expecting 0.1, getting 0.1
bd = BigDecimal.valueOf(0.05);
System.out.println("bd=" + bd);
System.out.println(df.format(bd));
bd = BigDecimal.valueOf(0.06);
System.out.println("bd=" + bd);
System.out.println(df.format(bd));
现在会产生
bd=0.15
0.2
bd=0.05
0.1
bd=0.06
0.1
顺便说一句,正如 Scary Wombat 指出的那样,掩码设置为 0.0 而不是 #.# 将使 0.6 0。但我认为这是我开始查看时的后期编辑。使用#.#。
关于java - 即使显式设置,DecimalFormat 使用不正确的 RoundingMode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37201146/
我有这个代码: public double theInterest(){ return (accountBalance*i) +accountBalance; 我的问题是,有没
我有一个 DecimalFormat ,其模式如下 "#,###.###"但是,当我想输入例如 50.05 时,它不允许这样做,因为每次文本更改以及调用 时,我都会将字符串解析为数字 df.parse
在Java中,我试图让DecimalFormat强制指数符号上的符号。当它是积极的我需要一个加号出现。从我读到的内容来看,这似乎是理所当然的,但对我自己来说,它总是会引发错误。我知道可能还有其他方法可
我在使用 DecimalFormat 时遇到了最奇怪的事情。 我在网络应用程序中使用它。我设置了一些测试,但它在本地一直失败。我的一个 friend 运行了它,他能够成功运行 JUnit 测试。 奇怪
有人知道我在这里做错了什么吗?我有一个 float ,假设它是 0.04。格式化后变成0.03。显然输出结果已经比输入低0.01了。 这是我的代码: float creditAvailableProp
我想使用 DecimalFormat 将 float 格式化为给定的精度。我有的是这个 val formatter = DecimalFormat(if (precision > 0) "#0.${"
我正在为学校编写一个收银机程序,并添加一个“当前价格”标签。到目前为止,一切都很好。我试图使价格显示为 2 位小数,如果没有这种格式,它将显示 10 位以上小数的价格。这是我的代码: double a
我正在尝试为百万位小数的小数格式设置撇号分隔符。我收到格式错误的错误。 String text = ".000'000"; DecimalFormat dformat = new DecimalFor
目前,我在显示格式化小数时遇到问题。在我的本地计算机中,我有一个十进制值:0.002100000000 存储在数据库中。 @FacesConverter("bigDecimal4DigitsConv
我正在尝试格式化金额。但是小数值没有以正确的方式四舍五入。 public class Testing { private java.text.DecimalFormat dispAmt;
我正在使用 DecimalFormatter 读取格式化的十进制字符串值并将其转换为 float 。但是,当我运行时: DecimalFormat formatter = new Decima
我使用十进制格式在“.”之后获取 2 个数字,当区域设置为美国或法国时,它工作正常,但当区域设置为 Ar(阿拉伯语)时,它会给出此错误: java.lang.NumberFormatException
我想显示最多 6 位小数的 GPS 坐标。例如如果我的 GPS 位置类似于 x.yyyyyyyyyy,我只想显示 x.yyyyyy,为此我使用 DecimalFormat 类。但是,如果数字类似于 8
我的代码如下: DecimalFormat df = new DecimalFormat("0.##"); return Double.parseDouble(df.format(sum)); Sum
我尝试在 Android 中使用 NumberFormatter 格式化数字。我使用下面的代码,它工作得很好: NumberFormat formatter = new DecimalFormat(
我有一个以便士为单位的整数货币(例如:1234)。我需要输出为:$12.34。我们不允许在此赋值中使用 double 或 float ,只能使用整数。 这是我所拥有的: totalChange = 1
我想将所有数字四舍五入到小数点后 1 位。 例如 22.0 -6.1 我正在使用: DecimalFormat decimalFormat = new DecimalFormat("0.0"); mi
目前,我在 JTable 中显示了具有 3 位小数的 BigDecimal 值。当我得到的值为 2.500 或 1.000 时,我想要 2.5 和 1.0。这就是我尝试这个的原因:
我使用DecimalFormat类将数字格式化为字符串,反之亦然。 在我的数据库中,Java double 以特定方式表示:例如 128.88 存储为“00012888”。为了实现这一点,我使用“00
收到所有的问候。 我需要验证一个文本对应于一个数字。项目区域设置为 es_CO。我现在遇到的问题是,带有用作小数点分隔符的句点的文本被解析为整数,而这应该是一个错误,因为在上述位置,小数点分隔符是一个
我是一名优秀的程序员,十分优秀!