Добавления к проницательности, предоставленной бериллий, я могу подтвердить заявленное поведение и выследил проблему с ошибкой в эталонной реализации. Я взял на себя смелость reporting the issue и мои выводы вместе с предлагаемым исправлением.
Действительно, метод doubleValue(Unit<Q>)
из NumberQuantity
, который используется под капотом в шагах преобразования, ошибочно вычисляет обратное преобразование между единицами. Это объясняет наблюдение ФП, что умножение и деление на постоянные факторы оказываются обратимыми при применении в качестве единичных преобразований.
Поскольку фабрика по умолчанию только для объектов возвращает объекты типа NumberQuantity
, все созданные таким образом количества влияют. Тем не менее, похоже, работают другие типы, такие как DoubleQuantity
. Как было предложено в ответе Бериллием, они могут быть созданы с помощью Quantities.getQuantities(<value>, <unit>)
. Следующий фрагмент кода показывает, что перерывы конвертации для NumberQuantity
, полученной с завода по умолчанию, но работает правильно для DoubleQuantity
:
package test.jsciunits;
import javax.measure.spi.ServiceProvider;
import javax.measure.Quantity;
import javax.measure.quantity.Length;
import javax.measure.spi.QuantityFactory;
import tec.units.ri.quantity.Quantities;
import static tec.units.ri.unit.Units.*;
import static tec.units.ri.unit.MetricPrefix.*;
public class JScienceUnits {
public static void main(String[] args) {
ServiceProvider provider = ServiceProvider.current();
QuantityFactory<Length> lengthFactory = provider.getQuantityFactory(Length.class);
Quantity<Length> q = lengthFactory.create(5.0, METRE);
Quantity<Length> r = Quantities.getQuantity(5.0, METRE);
System.out.println("q = " + q + ", q.to(CENTI(METRE)) = " + q.to(CENTI(METRE)));
System.out.println("r = " + r + ", r.to(CENTI(METRE)) = " + r.to(CENTI(METRE)));
}
}
Это производит
q = 5.0 m, q.to(CENTI(METRE)) = 0.05 cm
r = 5.0 m, r.to(CENTI(METRE)) = 500.0 cm
, где вторая линия показывает правильный результат преобразования.
'CENTI (SI.METRE)' будет альтернативой. Разве нет форума JScience? –
@JoopEggen То же самое происходит при использовании CENTI, я постараюсь искать форумы, но технически это не JScience. – zjuhasz
Ищите новую версию библиотеки. Это, должно быть, не модульная версия, где кто-то серьезно ошибался. –