我正在使用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()