当前位置: 首页 > 面试题库 >

Java BigDecimal精度问题

夔高寒
2023-03-14
问题内容

我知道以下行为是一个老问题,但我仍然不明白。

System.out.println(0.1 + 0.1 + 0.1);

或者即使我使用 BigDecimal

System.out.println(new BigDecimal(0.1).doubleValue()
    + new BigDecimal(0.1).doubleValue()
    + new BigDecimal(0.1).doubleValue());

为什么这个结果是:0.30000000000000004而不是:0.3

我该如何解决?


问题答案:

你真正想要的是

new BigDecimal("0.1")
 .add(new BigDecimal("0.1"))
 .add(new BigDecimal("0.1"));

new BigDecimal(double)构造得到的所有的不精确性double,所以由你说的时候0.1,你已经引入了舍入误差。使用String构造函数可避免与通过导致的舍入错误double



 类似资料:
  • 问题内容: 我有N个JSliders列表(N不会在程序上更改,只是随着我添加更多功能而已。当前N等于4)。所有滑块的值之和必须等于100。随着一个滑块的移动,其余的滑块应进行调整。每个滑块的值范围从0到100。 当前,当更改滑块(伪代码)时,我正在使用以下逻辑: 此设置的问题是滑块的值存储为整数。因此,当我调整滑块时,会遇到精度问题:滑块会根据比例值抽动或完全不移动。同样,总价值不一定总等于100

  • 问题内容: 我的同事做了这个实验: 对于这个一年级的操作,我希望得到以下输出: 但是意外的输出是: 为什么在如此简单的操作中double会失败?而且如果double不是这项工作的数据类型,我应该使用什么? 问题答案: 在内部以分数形式存储在 二进制文件中 -例如 值-或值-不能以精确的分数形式存储在二进制中,因此不能存储精确的值,并且相减后的值也不太精确。 如果您关心精确的十进制算术,请使用。 您

  • ​https://github.com/camsong/blog/issues/9​

  • 我有一个用例,只有当数字的精度大于某个数字时,我才想设置比例。换句话说,如果精度为5,我想将比例设置为4,但如果精度小于4,则保持数字不变。 这是我期待的预期结果-

  • 问题内容: 文档的内容如下(强调我的意思)。 此方法只能用于测量经过的时间,与系统或挂钟时间的任何其他概念无关。返回的值表示自某个固定但任意时间以来的纳秒(也许是将来的时间,因此值可能为负)。 此方法提供纳秒精度,但不一定提供纳秒精度。 无法保证值更改的频率。 如我所见,这可以用两种不同的方式解释: 在句子中 大胆 上面是指个人的返回值。然后,将在数字意义上理解精度和准确性。也就是说,精度是指有效

  • 问题内容: 我遇到这样的情况,两个人可能在两台不同的计算机上以相同的顺序工作(存储在MS SQL数据库中)。为了防止数据丢失,在这种情况下,一个人先保存订单的副本,然后再稍等一会再保存他的副本并覆盖第一个副本,我在保存之前对 lastSaved 字段(日期时间)添加了一个检查。 该代码大致如下所示: 这在大多数情况下都有效,但是我发现了一个小错误。 如果 orderIsChangedByOther