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

Мы используем 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 м. Реализация использует double значения внутри, и теряет точность при преобразовании значений. Нам нужно было бы округлить / ввести шкалу к значению, которое не является идеальным.

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

1 ответ

Решение

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

Другие вопросы по тегам