zju*_*asz 6 java jscience jsr363
我正在使用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));
Run Code Online (Sandbox Code Playgroud)
这打印503.0米.显然有些东西是非常错误的,这应该是3.05米.我发现很难相信这实际上是图书馆的一个错误,我希望有人可以告诉我我错过了什么.
经过一番研究后,我已经能够重现所讨论的奇怪现象。看来,在将 a 传递到 QuantityFactory时使用multiply()或方法会产生奇怪的效果。在示例中: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))
Run Code Online (Sandbox Code Playgroud)
输出以下内容:20.5 dm. 即使在使用 时MetricPrefix(这似乎是设置非基本 SI 单位的默认方法),它似乎也会生成极其不准确的Units。使用以下内容:
Quantity secondQuant = quantFactory.create(20.0,MetricPrefix.KILO(Units.METRE))
Run Code Online (Sandbox Code Playgroud)
输出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))
Run Code Online (Sandbox Code Playgroud)
输出12.0 m,这显然是正确的答案。
老实说,最好的解决方案是在创建 时根本不使用这些操作,并使用内置的Quantity枚举转换为其他测量单位。getConverter()MetricPrefix
更好的创建方法Quantities是使用Quantities.getQuantities()