除了JSR-275(被拒绝和放弃)和度量单位API(它们似乎没有任何生产质量的实现)之外,是否有任何Java库处理测量单位?
答案 0 :(得分:1)
我编写了一个不使用静态排版的 units 库(因为在我遇到的许多实际应用程序中,这会比我希望这样的库更麻烦)。 它旨在处理基于字符串的单位以及更清晰的定义单位。 一些受支持的功能包括:
值的转换,例如:
Units.convert(3, "m", "mm");
Units.convert(3, SiBaseUnit.METER, "mm");
都会返回 3000
。
基于字符串的单位的简化,例如:
Units.simplify("kg^3 m^4 s^-6 A^-1");
将返回 "J^2 T"
。
在特定上下文中查找单元的名称,例如:
Units.inContext("lx s", UnitContextMatch.COMPATIBLE, PhysicsContext.PHOTOMETRY)
将返回一个包含 ("luminous exposure")
的可导航集合。
支持 SI units、二进制单位、imperial units、US customary units、atomic units、planck units 等等。用户还可以轻松定义自己的单位。
完全支持任意对数单位,例如
LevelUnit.BEL.inReferenceTo(1, Unit.of("mV")); // automatically determines ref type -> root power
LevelUnit.BEL.inReferenceTo(1, Unit.of("W"), LevelUnitReferenceType.POWER); // specify type explicitly
Unit.of("ln(re 1 nA)") == LevelUnit.NEPER.inReferenceTo(1, Unit.of("nA")); // true
支持SI前缀、二进制前缀并允许用户轻松实现自己的前缀
可以处理不相关的未知单位,例如:
Units.convert(3, "m^2 this_is_not_a_unit", "mm^2 this_is_not_a_unit");
将返回 3e6
,因为未知单位 this_is_not_a_unit
在转换的两边是相同的。
对于代码的性能关键部分,可以获得转换因子(如果转换是纯乘法),例如:
Units.factor("kg", "t");
将返回 1e-3
。
允许检查等效性,例如
Units.equivalent(1, "s", "min");
将返回 false,因为 1min
与 1s
不同。另一方面,检查可兑换性
Units.convertible("s", "min");
将返回 true
。
紧密集成在 coordinates 库中(从 Java 16 开始,该库仍然需要预览功能,但从 Java 17 开始,它已准备好投入生产)
常量是通过一个 Constant
接口实现的,该接口支持例如:
定义自己的常量,例如
// (3 ± 0.2) mole
Constant.of(3, 0.2, "mole");
链接命令,例如
// constant with the distance travelled by light in vacuum in (2 ± 0) seconds as value
PhysicsConstant.SPEED_OF_LIGHT_IN_VACUUM.mul(2, 0, SiBaseUnit.SECOND);
// constant of the elementary charge per (electron) mass
PhysicsConstant.ELEMENTARY_CHARGE.div(PhysicsConstant.ELECTRON_MASS);
Constant c = Constant.of(3, 0.2, "mole");
PhysicsConstant.SHIELDING_DIFFERENCE_OF_T_AND_P_IN_HT.mul(c);
(简单的)不确定性传播
Constant
接口为 jatex 模块中的 Texable
接口提供默认实现,以便常量可以轻松返回正确的 LaTeX 代码。
为 NIST 定义的大多数物理常数以及一些数学常数正确记录的实现。
答案 1 :(得分:0)