java - 为什么 BigDecimal.ZERO 是未缩放的?

标签 java biginteger bigdecimal zero

BigDecimal.ZERO 的 Javadoc 说值 0,小数位数为 0。 顾名思义,BigDecimal.ZERO code> 应该返回值 0.0

我也知道 BigDecimal.ZERO 的编码方式:

private static final BigDecimal zeroThroughTen[] = {
        new BigDecimal(BigInteger.ZERO,         0,  0, 1),
        new BigDecimal(BigInteger.ONE,          1,  0, 1),
...
}

// Constants
/**
 * The value 0, with a scale of 0.
 *
 * @since  1.5
 */
public static final BigDecimal ZERO =
        zeroThroughTen[0];

我不明白为什么在 Java 中决定 BigDecimal.ZERO 返回未标定的零而不是返回十进制零(至少默认标度为 1,即 0.0).

需要什么 BigDecimal.ZEROBigInteger.ZERO 都返回值 0 小数位数 0

最佳答案

我不知道为什么你认为 BigDecimal.ZERO 应该是 0.0。为什么不是 0.000.000

用 0 标度定义 BigDecimal.ZERO 的好处在于,开发人员可以自行设置所需的标度。例如,您始终可以构造一个具有不同标度的值为 0 的 BigDecimal:

BigDecimal zero = BigDecimal.ZERO.setScale(2);

比例 0 提供了一个很好的默认值并遵守 principle of least astonishment .

让我们暂时承认 BigDecimal.ZERO 被定义为 0.0。考虑以下代码:

BigDecimal b = new BigDecimal("20");
BigDecimal b2 = new BigDecimal("20").add(BigDecimal.ZERO);
System.out.println(b.equals(b2)); // false ??? since when 20 != 20 + 0 ??

bb2 不会相等(根据 BigDecimal.equals ),因为它们会有不同的比例:b 会有比例0 和 b2 的比例为 1(因为 add 返回一个 BigDecimal,其比例是两个 BigDecimal 比例的最大值).

关于java - 为什么 BigDecimal.ZERO 是未缩放的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32760661/

相关文章:

java - 当我第二次按下按钮时,应用程序停止工作

java - SimpleDateFormat 和 android.text.format.DateFormat 有什么区别?

c++ - 添加两个表示为字符串的大数字的段错误

java BigDecimal arithmaticException 无效操作

java - 创建一个 Java for 循环来连接 2 组字符串

java - 使用selenium webdriver执行maven项目时获取 "Null pointer exception"

c++ - Microsoft Windows 上的 C 或 C++ BigInt 库

C# 字符串以特定字符结尾为整数

java - 将大十进制格式转换为美元形式的最佳方法是什么?

Java 8 BigDecimal 乘法方法在被反转时失去精度