数学显示模式
数学计算器界面的显示状态与运算类型,共两个枚举: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 内部没有任何地方给它赋值。
相关条目
- 合成显示模式 - 另一个界面的
Mode(4) /IO(3) - 数据文件 -
record.json的math段如何存这四个字段 - 本 mod 没有的东西 - 本 mod 不提供的数值维度