数学显示模式

数学计算器界面的显示状态与运算类型,共两个枚举:State(3 值)与 Operator(5 值)。这个界面完全不使用配方、物品或流体,只有 BigDecimal 运算。

基本信息

属性 值
枚举类 me.towdium.jecalculation.data.structure.RecordMath
状态枚举 RecordMath.State,3 值
运算枚举 RecordMath.Operator,5 值
运算精度 MathContext(7, RoundingMode.HALF_UP)
数值类型 java.math.BigDecimal
数据源 Controller.rMathClient(客户端本地,与合成记录分开保存)

State:显示状态(3 值)

枚举值 含义 界面表现
INPUT 正在输入数字 输入框可编辑,结果区显示上次计算结果
OUTPUT 刚算出结果 显示 last 的运算结果
ERROR 上一次输入非法 提示解析失败,结果区保留 last

RecordMath 里与状态相关的字段:

字段 类型 NBT 键 说明
last BigDecimal KEY_LAST = "last" 上一次运算的左操作数/结果
state State KEY_STATE = "state" 当前显示状态
operator Operator KEY_OPERATOR = "operator" 待执行的运算
current String KEY_CURRENT = "current" 当前输入缓冲(字符串,未解析)

另有一个常量 DOT_NONE = -1,用于表示「小数点尚未输入」。

Operator:运算类型(5 值)

这是界面上五个运算按钮对应的枚举值。每个取值的算术定义都写死在 operate() 的 switch 里:

枚举值 符号 实现 精确公式
EQUALS = return b 直接返回第二个操作数 b,不与 a 做任何运算
PLUS + a.add(b) a + b
MINUS - a.subtract(b) a - b
TIMES × a.multiply(b) a × b
DIVIDE ÷ a.divide(b, context) a ÷ b,带 7 位有效数字的 MathContext

源码:

public BigDecimal operate(BigDecimal a, BigDecimal b) {
    switch (this) {
        case PLUS:    return a.add(b);
        case MINUS:   return a.subtract(b);
        case TIMES:   return a.multiply(b);
        case DIVIDE:  return a.divide(b, context);
        case EQUALS:  return b;
        default: throw new RuntimeException("Internal Error");
    }
}

EQUALS 值得单独注意:它的实现是 return b,不是 a 也不是比较运算。 在连续运算链里它起「提交/确认当前输入」的作用——把正在输入的 b 直接作为结果。 default 分支抛 RuntimeException("Internal Error"),正常路径不可达。

精度

public static MathContext context = new MathContext(7, RoundingMode.HALF_UP);
  • 有效数字 7 位;
  • 舍入模式 HALF_UP(四舍五入,中点进位)。

注意这个 context 只用于 DIVIDE。PLUS / MINUS / TIMES 调用的是不带 MathContext 的 BigDecimal 精确运算,因此加减乘不会丢精度,只有除法会。

context 是 public static 非 final 字段,理论上可被其他模组改写, 但本 mod 内部没有任何地方给它赋值。

相关条目