我正在使用 JSR363 的引用实现。我已经尝试了很多变体,但我将以这段代码为例。
ServiceProvider provider = ServiceProvider.current();
QuantityFactory<Length> lengthFactory = provider.getQuantityFactory(Length.class);
Quantity<Length> first = lengthFactory.create(5, Units.METRE.divide(100.0));
Quantity<Length> second = lengthFactory.create(3, Units.METRE);
System.out.println(second.add(first));
这将打印 503.0 米。显然有些地方出了问题,这应该是 3.05 m。我发现很难相信这实际上是图书馆的一个错误,我希望有人能告诉我我遗漏了什么。
最佳答案
在仔细研究之后,我已经能够重现所讨论的奇怪之处。似乎在将 Unit
传递到 QuantityFactory 时使用 multiply()
或 divide()
方法会产生奇怪的效果。例如:
Quantity firstQuant = quantFactory.create(10.0,Units.METRE)
Quantity secondQuant = quantFactory.create(20.0,Units.METRE.divide(10.0))
System.out.println(secondQuant.add(firstQuant))
输出以下内容:20.5 dm
。即使使用 MetricPrefix
(这似乎是设置非基本 SI 单位的默认方法),它似乎也会生成极其不准确的 Units
。使用以下内容:
Quantity secondQuant = quantFactory.create(20.0,MetricPrefix.KILO(Units.METRE))
输出 10020.0 km
远不准确。但是,以下内容:
Quantity firstQuant = quantFactory.create(10.0,Units.METRE)
Quantity secondQuant = quantFactory.create(20.0,Units.METRE)
System.out.println(secondQuant.divide(10.0).add(firstQuant))
输出12.0 m
,显然是正确答案。
老实说,最好的解决方案是在创建 Quantity
时简单地不使用这些操作,并使用内置的 getConverter()
转换为其他测量单位MetricPrefix
枚举。
创建 Quantities
的更好方法是使用 Quantities.getQuantities()
关于Java 度量单位库加法和减法返回不正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39717722/