- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用带有 HALF_UP 舍入模式的 DecimalFormat,但我有一个无法正常工作的场景,我不知道为什么。
DecimalFormat df = new DecimalFormat("#.##");
df.setRoundingMode(RoundingMode.HALF_UP);
float tmp = (float) (0.5 * 1.05);
df.format(tmp);
float mul = Float.parseFloat(df.format(tmp));
我希望 mul
变量值具有 0.53 值,而我收到了 0.52 值。
我使用的是 Java 1.8.0_131。
解决的最终代码
BigDecimal mul = new BigDecimal(0.5).multiply(new igDecimal(1.05));
mul = mul.setScale(2, RoundingMode.HALF_UP);
System.out.println(mul);
最佳答案
您正在使用float
数据类型。
此数据类型无法精确保存值0.525
。请参阅此代码以使其清楚:
float value = (float) (0.5 * 1.05);
DecimalFormat df = new DecimalFormat("#.########################");
System.out.println(df.format(value));
打印出:
0.5249999761581421
使用模式 RoundingMode.HALF_UP
对此类值进行舍入将正确得到0.52
。
double
值似乎能够精确存储值0.525
:
double value = 0.5 * 1.05;
DecimalFormat df = new DecimalFormat("#.########################");
System.out.println(df.format(value));
这将打印预期值:
0.525
使用模式 RoundingMode.HALF_UP
舍入该值现在将产生 0.53
!
注意:即使是 double
数据类型也不能精确存储值!
看看@MarkDickinson 的评论。存储的值为 0.525000000000000002220446049250313080847263336181640625
,它恰好大于 0.525
,并且只是偶然舍入到预期值。
那该怎么办?
数据类型float
和double
是基于二进制的,而我们人类在处理数字时倾向于考虑基于十进制的。阅读文章"What Every Computer Scientist Should Know About Floating-Point Arithmetic"了解更多信息。
解决方案是使用基于小数的数据类型,该数据类型存在于 BigDecimal
中。
关于Java DecimalFormat HALF_UP 舍入错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45096882/
这个问题已经有答案了: Is floating point math broken? (33 个回答) 已关闭 5 年前。 所以我有这个代码 public String getRounded(doub
我正在使用带有 HALF_UP 舍入模式的 DecimalFormat,但我有一个无法正常工作的场景,我不知道为什么。 DecimalFormat df = new DecimalFormat("#.
我想将 BigDecimal 值四舍五入到最接近的整数。 我尝试使用此问题的解决方案 Java BigDecimal: Round to the nearest whole value ,但这对我不起
我正在尝试使用 scale=3 和 HALF_UP 舍入模式对 0.14049 进行舍入,并希望看到舍入值 = 0.141 但得到的是 0.140。 根据我的理解,最后一个十进制数字 9 应该将 4
以下代码: double doubleValue = 1713.6; float floatValue = 1713.6f; String fs = "%-9s : %-7s %-7s\n"; Sys
请随意评论我。下面的程序出了什么问题。它给出了不同的回合结果。 public class Test { public static String round(double value, int
据我了解,RoundingMode.HALF_UP 使用我们传统的舍入方式。但是,它没有给我想要的结果: 我正在使用具有不同参数(#、#.#、...等)的 DecimalFormat() 并输入 do
我们有以下代码: BigDecimal net = price .divide(taxCumulative, RoundingMode.HALF_UP) .setScale(2, BigDecimal
我知道这个话题已经被广泛讨论了。但当我阅读 BigDecimal 主题的答案时,我感到困惑。我希望你不要因为我开始这个话题而生气。 我正在创建一个程序来对几个数字进行非常简单的除法。我有两个代表金额的
这个问题在这里已经有了答案: How to round 0.745 to 0.75 using BigDecimal.ROUND_HALF_UP? (6 个答案) 关闭 5 年前。 我正在从 0.4
以下: new MathContext(precision, RoundingMode.HALF_UP); 似乎有效。但是,以下返回错误: new MathContext(precision, Big
在 scala 中,我尝试使用 HALF_UP 舍入模式将以下数字舍入为小数点后 3 位精度。8409.3555 不幸的是,scala 返回 8409.356,但 Java 返回 8409.355 S
RoundingMode 允许程序员指定 float 的舍入方式。这一切都很棒,但我发现其中有一件事很奇怪。也许我只是误解了学校的一些基本知识。 但是这个舍入模式被描述为我在学校教的那个,“总是四舍五
我是一名优秀的程序员,十分优秀!