BigDecimal 有两个数字,一个整数和一个刻度。整数是“数字”,比例是小数点右边的位数。基本上是一个以 10 为基数的浮点数。
当您说这些在 BigDecimal 表示法中在技术上是不同的值时"1.0"
:"1.00"
1.0
integer: 10
scale: 1
precision: 2
= 10 x 10 ^ -1
1.00
integer: 100
scale: 2
precision: 3
= 100 x 10 ^ -2
在科学记数法中,您不会这样做,应该是1 x 10 ^ 0
或只是1
,但 BigDecimal 允许这样做。
在compareTo
比例尺中被忽略,它们被评估为普通数字,1 == 1
。在equals
整数和比例值进行比较,10 != 100
和1 != 2
。BigDecimal equals 方法忽略了object == this
我假设的检查,因为其目的是将每个 BigDecimal 都视为一种数字,而不是对象。
我会把它比作:
// same number, different types
float floatOne = 1.0f;
double doubleOne = 1.0;
// true: 1 == 1
System.out.println( (double)floatOne == doubleOne );
// also compare a float to a double
Float boxFloat = floatOne;
Double boxDouble = doubleOne;
// false: one is 32-bit and the other is 64-bit
System.out.println( boxInt.equals(boxDouble) );
// BigDecimal should behave essentially the same way
BigDecimal bdOne1 = new BigDecimal("1.0");
BigDecimal bdOne2 = new BigDecimal("1.00");
// true: 1 == 1
System.out.println( bdOne1.compareTo(bdOne2) );
// false: 10 != 100 and 1 != 2 ensuring 2 digits != 3 digits
System.out.println( bdOne1.equals(bdOne2) );
因为 BigDecimal 允许特定的“精度”,所以比较整数和小数位数与比较数字和精度大致相同。
尽管在谈论 BigDecimal 的precision() 方法时有一个半警告,如果BigDecimal 为0,该方法总是返回1。在这种情况下,compareTo && precision 评估为true,equals 评估为false。但0 * 10 ^ -1
不应该相等0 * 10 ^ -2
,因为前者是 2 位数字0.0
,后者是 3 位数字0.00
。equals 方法是比较值和位数。
我想 BigDecimal 允许尾随零很奇怪,但这基本上是必要的。像这样进行数学运算"1.1" + "1.01"
需要转换,但"1.10" + "1.01"
不需要。
因此,compareTo
将 BigDecimals 与数字进行比较,equals
并将 BigDecimals 与 BigDecimals 进行比较。
如果不需要比较,请在无关紧要的地方使用列表或数组。HashSet 和 TreeSet 当然是专门为保存独特元素而设计的。