【问题标题】:Java units of measurement libraries other than JSR-275 and Units of Measure APIJSR-275 和 Units of Measure API 以外的 Java 度量单位库
【发布时间】:2012-09-14 14:18:36
【问题描述】:

除了 JSR-275(被拒绝和放弃)和 Units of Measure API(似乎没有任何生产质量的实现)之外,是否有任何 Java 库处理度量单位?

【问题讨论】:

  • 你找到答案了吗? JScience 似乎功能齐全,但活动很少,似乎对这种库的需求很大,所以令人惊讶。
  • @RasmusStorjohann 不,我没有。

标签: units-of-measurement jsr-275


【解决方案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 unitsUS customary unitsatomic unitsplanck 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,因为 1min1s 不同。另一方面,检查可兑换性

    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 定义的大多数物理常数以及一些数学常数的正确记录实现。

【讨论】:

    【解决方案2】:

    【讨论】:

    • 仅链接的答案通常是 Stack Overflow 上的 frowned upon。随着时间的推移,链接可能会萎缩并变得不可用,这意味着您的答案将来对用户毫无用处。如果您可以在实际帖子中提供答案的一般详细信息,并引用您的链接作为参考,那将是最好的。
    猜你喜欢
    • 2011-05-13
    • 2011-02-23
    • 1970-01-01
    • 2013-11-13
    • 2011-09-22
    • 2011-05-12
    • 2018-07-08
    • 1970-01-01
    • 2018-12-02
    相关资源
    最近更新 更多