我可以理解,在大小数中,2.0并不等于2.00,因为2.00实际上使用了更高精度的数字。我很难理解为什么2e1
不被认为等于20
,因为这两个数字实际上使用相同数量的精确数字。依我看,它们只是完全相同数字的不同表示。
我知道,我可以使用striptrailingzero
和compareTo
而不是equals
,我只是对这背后的推理感兴趣。有人能帮我理解吗?
这是一个规模问题。
System.out.println(new BigDecimal("20").scale()); // 0
System.out.println(new BigDecimal("2E+1").scale()); // -1
BigDecimal认为数值相等但刻度不同的数字不相等。
我读到BigDecimal.equals的Java博士说: 将此BigDecimal与指定的对象进行相等比较。与compareTo不同,此方法仅当两个BigDecimal对象的值和比例相等时才认为它们相等(因此,使用此方法进行比较时,2.0不等于2.00)。 但是当我测试它时,不知何故我得到了意想不到的结果,等于。我想,出于同样的原因,当我把和放在中时,大小为1,而我预期大小为2。请看下面的代码,
我读到BigDecimal.equals的Java博士说: 将此BigDecimal与指定的对象进行相等比较。与compareTo不同,此方法仅当两个BigDecimal对象的值和比例相等时才认为它们相等(因此,使用此方法进行比较时,2.0不等于2.00)。 但是当我测试它时,不知何故,我得到了意想不到的结果,并且等于。我认为出于同样的原因,当我把和放在中时,大小为1,而我期望大小为2。请看下面的
问题内容: 实际上,我已经找到了可能的解决方案 当然,可以通过使比较更加健壮的方法来改进它,但是问题是此技术是否可以接受或是否有更好的解决方案? 如果有人知道为什么Java设计人员决定以这种方式实现BigDecimal的equals,那么阅读它会很有趣。 问题答案: 来自BigDecimal的Javadoc 等于 将其与指定的相等性进行比较。与之不同的是,此方法 仅在 两个对象的 值和比例 相等
来自Javadoc的: 注:如果对象用作中的键或中的元素,则应小心操作,因为的自然顺序与等于的顺序不一致。 例如,如果您创建一个并向其中添加和,则该集合将包含两个元素(因为值具有不同的比例,因此根据和,它们是不相等的),但是,如果对
问题内容: 为什么此代码有时返回1E + 1,而对于其他输入(例如17)却没有以科学计数法打印输出? 问题答案: 使用bigDecimal.toPlainString(): 输出:
描述 (Description) java.math.BigDecimal.subtract(BigDecimal subtrahend)返回一个BigDecimal,其值为(this - subtrahend),其标度为max(this.scale(),subtrahend.scale())。 声明 (Declaration) 以下是java.math.BigDecimal.subtract()