API единиц измерения (JSR-363) - ошибки с плавающей точкой - PullRequest
0 голосов
/ 24 октября 2018

Мы используем tec.units.unit-ri в качестве реализации JSR-363, javax.measure.unit-api.

Мы используем несколько типов веса, длины и температуры в нашем приложении, и мы решили использовать BigDecimal для их хранения.Выполняя некоторые преобразования, я понял, что ошибки с плавающей точкой появляются в наших случаях.

Unit<Length> metres = Units.METRE;
Unit<Length> centimetres = Units.METRE.divide(100);
BigDecimal valueInCentimetres = new BigDecimal("10.1");
Quantity<Length> valueInMetres = Quantities.getQuantity(valueInCentimetres, centimetres).to(metres) ;

Если я запускаю этот код, переменная valueInMetres содержит представление Double с ошибкой с плавающей запятой 0,10099999999999999 m.Реализация использует double значений внутри и теряет точность при преобразовании значений.Нам нужно округлить / ввести шкалу для значения, которое не является идеальным.

Есть ли что-то очевидное, что я делаю здесь неправильно?Я пропустил какой-то способ использования API, который позволяет мне сохранять точность, или все преобразования маршрутизируются по значениям Double и будут терять точность, независимо от того, что я делаю?

1 Ответ

0 голосов
/ 24 октября 2018

Продолжая поиск, задав этот вопрос, я понял, что мы использовали не ту библиотеку для нашего приложения. unit-ri предназначен для Java ME и использует double для внутреннего использования, uom-se предназначен для Java SE и использует BigDecimal.Это решает нашу проблему.

...