我知道以下行为是一个老问题,但我仍然不明白。
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