【问题标题】:Java Big Decimal Half Even Bug? [closed]Java Bigdecimal 一半偶数错误? [关闭]
【发布时间】:2019-02-28 20:20:26
【问题描述】:

我正在尝试专门使用这个值

new BigDecimal("23.025").setScale(2, RoundingMode.HALF_EVEN);

输出是 23.02,但应该是 23.03。是bug吗?

只是为了好奇DecimalFormat("#####0,00");也不起作用

还有什么建议吗?

【问题讨论】:

  • 为什么你认为应该是23.03?最后一位是3,不是偶数。您认为HALF_EVEN 中的EVEN 部分是什么意思,您为什么这么认为?
  • 当我遇到类似的问题时,我总是假设这个错误在我的理解中,而不是在 Java 本身中,而且我在 99.99% 的情况下都是对的。我敢打赌,你的赔率是相似的。
  • @LeonardoSilva 它还应该返回什么? 23.03?这不是一个偶数。你知道 even 是什么意思,对吧? 奇数的反义词。 3 是奇数,4 是偶数。
  • "数学上 0 到 4 下降,5 到 9 上升" 这称为HALF_UP 舍入模式:"舍入模式向“最近”舍入邻居”,除非两个邻居是等距的,在这种情况下舍入 向上。” --- 您要求 HALF_EVEN: “舍入模式向“最近”舍入邻居”,除非两个邻居是等距的,在这种情况下,向偶数邻居舍入。”
  • 也许您应该阅读文档,即RoundingMode 的javadoc,其中记录了所有这些内容,并附有显示四舍五入如何工作的漂亮表格。

标签: java rounding bigdecimal


【解决方案1】:

RoundingMode#HALF_EVENJavaDoc

舍入模式向“最近的邻居”舍入 除非两者 邻居是等距的,在这种情况下,向偶数舍入 邻居

在您的情况下,even 邻居是 02
JavaDoc 很重要!请务必阅读。
对于RoundingMode,可以找到here(Java 8 版本)。

【讨论】:

  • @LeonardoSilva 因为偶数是04。
  • @LeonardoSilva 因为23.035 有两个比例为2 的邻居:23.0323.04,而23.04偶数之一。 --- 同样,23.025 有两个比例为 2 的邻居:23.0223.0323.02偶数
  • @LeonardoSilva 在这种情况下没有 floorceil ,忘记它们。这里有偶数奇数
  • @LppEdd:好吧,现在只有三遍。但是最后一个太长了,重复了别人已经说过的话。 ;-)
  • 不确定是否/何时会发生,但我肯定会通知你。
猜你喜欢
  • 2015-06-21
  • 1970-01-01
  • 2012-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多