【问题标题】:Make BigDecimal truncate instead of round [duplicate]使 BigDecimal 截断而不是舍入 [重复]
【发布时间】:2014-02-10 20:59:55
【问题描述】:

我正在使用 BigDecimal 来处理我的应用程序中的正数,并且我想让它截断第 4 位之后的小数。 我似乎几乎可以通过 RoundingMode.DOWN 找到我想要的东西,但是当 BigDecimal 是从双精度创建时会出现一些问题。

例如:

System.out.println("123.11119 = " + new BigDecimal("123.11119").setScale(4, RoundingMode.DOWN)); //Print 123.1111 which is exactly what I want
System.out.println("123.1111 = " + new BigDecimal("123.1111").setScale(4, RoundingMode.DOWN)); //So does this one

但是,以下打印 123.1110 这根本不是我想要的:

System.out.println("123.1111 = " + new BigDecimal(123.1111d).setScale(4, RoundingMode.DOWN)); 

【问题讨论】:

  • 问题是123.1111d 可能被存储为123.111099999999,从而得到你的问题。
  • 是的。不要从双精度数创建 BigDecimals。
  • @DavidWallace 为什么?原来的双精度仍然不准确。
  • 因为将其转换为 String 具有正确的智能来选择小数位数最少的数字,该数字在四舍五入到该双精度的范围内。这意味着它将选择您真正想要的值。例如,Double.toString(123.1111) 将为您提供"123.1111"。当您的值已经为双倍时,这是唯一合理的做法。自然,您应该避免将十进制数字存储为双精度数,但如果数据来自您无法控制的某个来源,您并不总是有选择的余地。

标签: java double rounding bigdecimal


【解决方案1】:

这是因为表示问题。

实际的值 123.1111d 可能类似于 123.111091231918498。

这就是为什么当你想得到精确值时建议使用字符串构造函数。

【讨论】:

  • 好的。我会接受你的回答,我想解决方案是“不要使用双重构造函数”!
猜你喜欢
  • 2013-03-20
  • 1970-01-01
  • 2011-01-26
  • 2017-01-29
  • 1970-01-01
  • 2011-12-27
  • 2010-09-24
相关资源
最近更新 更多