【问题标题】:Java BigDecimal.ROUND_HALF EVEN number with 3 decimals (odd and even)Java BigDecimal.ROUND_HALF 偶数,带 3 位小数(奇数和偶数)
【发布时间】:2018-07-09 13:29:14
【问题描述】:

晚上好:

我在用 3 位或更多小数四舍五入时遇到问题。

例如,我有这个号码:1544.565

我正在尝试将其四舍五入到 1544.57


我试过了:

  • BigDecimal.ROUND_HALF_EVEN
  • BigDecimal.ROUND_UP
  • RoundingMode.HALF_EVEN
  • RoundingMode.HALF_UP
  • RoundingMode.CEILING
  • RoundingMode.UP

他们都给了我同样的错误结果:1544.56 我正在尝试获取 1544.57

请问有什么解决办法吗?

【问题讨论】:

  • 如果您有 1544.564,您应该指定预期的舍入模式,否则可能会有多个答案,但并非所有答案都是您需要的
  • 请分享代码
  • OP 拒绝展示一个完整的例子,所以我将分享我的发现,这很可能是造成混乱的原因:如果你采用一个用字面值 1544.565f 初始化的浮点数,它的实际实习值就像 1544.564999。因此,尝试将其四舍五入为两位小数将四舍五入为 1544.56。当对双打做同样的事情时,情况并非如此。因此,问题是您认为您正在使用 BigDecimals,而实际上您在计算中涉及浮点数。
  • 所有你的代码-_-°
  • 更有趣的代码还没有显示:如何初始化 BigDecimal:使用字符串、浮点数还是双精度数?只有在第一种情况下,您才会得到 exact 数字。大多数情况下,浮点数和双精度数会产生近似值,这可能不是较高数字之间的正好中间。同样,HALF_EVEN 将总是产生一个偶数最后一个数字,所以它永远不会是 7。

标签: java numbers decimal rounding bigdecimal


【解决方案1】:

试试ROUND_UP 2 级:

BigDecimal bigDecimal = new BigDecimal("1544.565");
System.out.println(bigDecimal.setScale(2, BigDecimal.ROUND_UP)); // 1544.57

【讨论】:

  • @DeathGun 显示您的完整代码。别再说小而含糊的词了。
  • @DeathGun 这适用于 JDK 1.7 和 1.8 版本。通过解析floatdoubleString 进行测试。输出为1544.57
  • @RoshanaPitigala 如果您希望它与任何输入值一起使用,那么您只能提供字符串。
  • System.out.println("ROUND_HALF_EVEN == " + number.setScale(2, BigDecimal.ROUND_HALF_EVEN).toString());
  • 展示你如何初始化number。了解这一点很重要,这样人们才能真正帮助您。
【解决方案2】:

确认here;

double a = 1544.565;
double rounded = Math.round(a * 100.0) / 100.0;
System.out.println(rounded);

输出1544.57

【讨论】:

  • 是的,但是一种适用于排序的每个输入的方法会更好。这个没有。
  • 仅适用于 double 如果 afloat 输出是 1544.56
  • @RoshanaPitigala 从根本上说它有时会起作用,但经常会失败,具体取决于输入值。所以,这不是一个有效的解决方案。
【解决方案3】:

在 JDK 1.8 中,您可以为此使用 java.text.DecimalFormat

new DecimalFormat("0.00").format(1544.565)

输出

1544.57

阅读doc 以识别更多模式字符。


更新 2(回复 this comment):

您正在使用BigDecimal.ROUND_HALF_EVEN,请改用BigDecimal.ROUND_HALF_UP

不要使用BigDecimal.ROUND_UP,它总是将数字四舍五入。

BigDecimal.ROUND_HALF_UP

舍入模式向“最近的邻居”舍入,除非两个邻居等距,在这种情况下向上舍入。
~Java doc~

例子:

BigDecimal number = new BigDecimal("1544.565");
System.out.println(number.setScale(2, BigDecimal.ROUND_HALF_UP).toString());

输出

1544.57

【讨论】:

  • 这个例子不是很好,因为如果不做几次测试就很难判断它是向上还是向下取整。 BigDecimal 会更好。
  • @DeathGun 你的 java 版本是多少?
  • @DeathGun 抱歉,它在 JDK 1.7 中给出了 1544.56。等等我给你一个更好的解决方案
  • 更改 SDK 版本会在这个 -_-° 上产生不同的结果,这比奇怪更奇怪。不幸的是,我没有保留 JDK 1.7 来验证。
  • 是的,奇怪的是,使用不同的 JDK 会给我们带来不同的结果。我正在尝试这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-12
  • 2016-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多