我正在使用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 m。显然是很不对劲,应该是3.05 m。我很难相信这实际上是库中的错误,我希望有人可以告诉我我所缺少的内容。

最佳答案

在研究了这一点之后,我已经能够重现有问题的怪异之处。似乎在将multiply()传递到QuantityFactory时使用divide()Unit方法会产生奇怪的效果。例如:

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()

10-07 16:14