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
ценности и потеряет точность, что бы я ни делал?